在灵药中,可以用两种不同的方式定义"和"函数:
def sum, do: 0
def sum(a), do: a
def sum(a, b), do: a + b
def sum(a, b, c), do: a + b + c
Run Code Online (Sandbox Code Playgroud)
要么
def sum() do 0 end
def sum(a) do a end
def sum(a,b) do a + b end
def sum(a,b,c) do a + b+ c end
Run Code Online (Sandbox Code Playgroud)
我甚至可以混合使用这两种方法:
def sum() do 0 end
def sum(a) do a end
def sum(a,b) do a + b end
def sum(a,b,c), do: a + b + c
Run Code Online (Sandbox Code Playgroud)
我的问题是:为什么有两种方法可以实现相同的目标?在内联函数的情况下,第二个是首选吗?它们中的任何一个有什么优点?
提前致谢!
Gaz*_*ler 11
该do...end格式是语法糖do:格式.
这不仅适用于功能外,还以if,case,cond,等.
case 1, do: (1 -> "a")
Run Code Online (Sandbox Code Playgroud)
VS
case 1 do
1 -> "a"
end
Run Code Online (Sandbox Code Playgroud)
通常,do...end除非函数定义足够短以适合一行,否则格式是首选.
do在这种情况下,实际上是关键字列表中的参数.if宏的实现看起来像:
do_clause = Keyword.get(clauses, :do, nil)
else_clause = Keyword.get(clauses, :else, nil)
Run Code Online (Sandbox Code Playgroud)
这将获取do...else...end块内的表达式:
if foo do
#this gets stored in do_clause
else
#this gets stored in else_clause
end
Run Code Online (Sandbox Code Playgroud)
需要注意的执行if有所改变,你可以看到我这里指的是版本的https://github.com/elixir-lang/elixir/blob/1a7412502fd581da8ef1378fcd5a057ab96378f7/lib/elixir/lib/kernel.ex#L2294