在灵药中,可以用两种不同的方式定义“和”函数:
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
我的问题是:为什么有两种方法可以实现相同的目标?在内联函数的情况下,第二个是首选吗?它们中的任何一个有什么好处?
提前致谢!
答案 0 :(得分:11)
do...end
格式是do:
格式的语法糖。
这不仅适用于功能,也适用于if
,case
,cond
等。
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..end
是do:
的语法糖。这意味着它是一种使事物更易于阅读或表达的语法。它使语言变得更加甜美。供人类使用:事物可以更清晰,更简洁地表达,或者以某种其他方式表达。[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")