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

时间:2015-10-28 15:55:40

标签: 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

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

我甚至可以混合使用这两种方法:

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

我的问题是:为什么有两种方法可以实现相同的目标?在内联函数的情况下,第二个是首选吗?它们中的任何一个有什么好处?

提前致谢!

2 个答案:

答案 0 :(得分:11)

do...end格式是do:格式的语法糖。

这不仅适用于功能,也适用于ifcasecond等。

case 1, do: (1 -> "a")

VS

case 1 do
  1 -> "a"
end

一般情况下,除非函数定义足够短以适合一行,否则首选do...end格式。

在这种情况下,

do实际上是关键字列表中的参数。 if宏的实现类似于:

do_clause = Keyword.get(clauses, :do, nil)
else_clause = Keyword.get(clauses, :else, nil)

这会获得do...else...end块内的表达式:

if foo do
  #this gets stored in do_clause
else
  #this gets stored in else_clause
end

注意 if的实施略有变化,您可以在https://github.com/elixir-lang/elixir/blob/1a7412502fd581da8ef1378fcd5a057ab96378f7/lib/elixir/lib/kernel.ex#L2294看到我所指的版本

答案 1 :(得分:2)

方便程序员。以任何上述方式定义函数不会对实际函数产生任何影响。

do..enddo:的语法糖。这意味着它是一种使事物更易于阅读或表达的语法。它使语言变得更加甜美。供人类使用:事物可以更清晰,更简洁地表达,或者以某种其他方式表达。[wikipiedia]

一般情况下,单行首选do:语法,多行do..end首选

def count(limit), do: count(1,limit)

defp count(current,limit) when current <= limit do
    IO.inspect(current)
    count(current+1,limit)
end

#The underscore means we dont care what the arguments are
defp count(_,_), do: IO.puts("finished")