gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 13:31:26 27 4
gpt4 key购买 nike

在 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

我的问题是:为什么有两种方法可以达到相同目的?对于内联函数,第二个优先吗?两者的优点是什么?

提前致谢!

最佳答案

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

这不仅适用于函数,还适用于ifcasecond等。

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


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上看到我指的版本

关于elixir - 为什么有两种方法在Elixir中定义命名函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33395763/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com