Ecto.Repo.delete / 2:查看类型说明时,如何知道是否存在默认值?

时间:2019-05-09 17:24:51

标签: elixir phoenix-framework

这是类型说明:

delete()

在最后的示例中,使用一个参数调用delete()。而且,我可以使用一个参数成功调用 def delete_item(%Auction.Item{}=item) do @repo.delete(item) #<=== HERE end

React Link

因此,这告诉我第二个参数必须具有默认值。有办法知道吗?

2 个答案:

答案 0 :(得分:2)

浏览文档和similar question's answer时,似乎typespec中不支持默认参数。 2014年的This Github issue解释了此功能的一些取舍。

人们怎么会知道第二个参数是可选的?除了对Elixir代码进行源代码划分外,还希望将其记录下来。对于此版本的name := "sink-to-aggs" version := "0.1" scalaVersion := "2.11.10" libraryDependencies += "com.typesafe" % "config" % "1.3.3" libraryDependencies += "org.apache.spark" %% "spark-sql" % "2.0.0" libraryDependencies += "org.apache.spark" %% "spark-core" % "2.0.0" libraryDependencies += "org.apache.spark" %% "spark-hive" % "2.0.0" libraryDependencies += "org.apache.hadoop" % "hadoop-client" % "2.7.3" libraryDependencies ++= Seq("org.slf4j" % "slf4j-api" % "1.7.5", "org.slf4j" % "slf4j-simple" % "1.7.5") libraryDependencies += "mysql" % "mysql-connector-java" % "5.1.5" libraryDependencies += "com.datastax.spark" %% "spark-cassandra-connector" % "2.0.0" assemblyMergeStrategy in assembly := { case PathList("META-INF", xs@_*) => MergeStrategy.discard case x => MergeStrategy.first } ,该参数在typespec中命名为Ecto.Repo.delete,并在“选项”标题下进行了描述,在我看来,这强烈建议它们是可选的。

答案 1 :(得分:0)

这取决于回调的实现方式。

您不能在回调规范中使用默认参数,但可以使用实现回调的默认参数定义一个函数。

defmodule Converter do
  @doc """
  Callback doc.
  """
  @callback convert(number(), any(), any()) :: number()
end

defmodule MyConverter do
  @behaviour Converter

  def convert(number, from_unit \\ :km, to_unit \\ :miles) do
    # ...
  end
end

但这还不足以使IEx.Helpers.h宏实际显示默认参数,因为它可用于显式定义的文档。

在上面的示例中,仅定义了回调规范的@doc,因此将显示出来。

iex> h MyConverter.convert
@callback convert(number(), any(), any()) :: number()

Callback doc.

实际上,您需要为实现回调以实现所需功能的函数定义@doc

defmodule MyConverter do
  @behaviour Converter

  @doc """
  Implementation docs.
  """
  def convert(number, from_unit \\ :km, to_unit \\ :miles) do
    # ...
  end
end

iex> h MyConverter.convert

            def convert(number, from_unit \\ :km, to_unit \\ :miles)

Implementation docs.

现在与您的问题所概述的情况相关:使用Ecto.Repo时,它在MyApp.Repo模块中定义了一个实现delete回调但没有模块文档的函数。这就是为什么您无法通过IEx帮助器看到此函数的默认参数的原因。