这是类型说明:
delete()
在最后的示例中,使用一个参数调用delete()。而且,我可以使用一个参数成功调用 def delete_item(%Auction.Item{}=item) do
@repo.delete(item) #<=== HERE
end
:
React Link
因此,这告诉我第二个参数必须具有默认值。有办法知道吗?
答案 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帮助器看到此函数的默认参数的原因。