为什么有两种方法可以在elixir中定义命名函数?

San*_*oli 6 elixir

在灵药中,可以用两种不同的方式定义"和"函数:

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