我创建了一个模块,如下所示:
defmodule Sum do
def sum(x,y) do
x + y
end
def sum(x) do
x
end
end
Run Code Online (Sandbox Code Playgroud)
它的工作原理与我预期的模式匹配当然:
iex(2)> Sum.sum(3)
3
iex(3)> Sum.sum(3,5)
8
Run Code Online (Sandbox Code Playgroud)
当我定义一个匿名函数,如:
iex(1)> sum = fn
...(1)> x, y -> x + y
...(1)> x -> x
...(1)> end
** (CompileError) iex:1: cannot mix clauses with different arities in function definition
Run Code Online (Sandbox Code Playgroud)
然后编译器抱怨.为什么我不能与不同的arities混合,上面的例子与模块它的作用就像一个魅力.
Cod*_*nis 11
sum/2和sum/1实际上是2种不同的功能.执行的那个不是通过模式匹配来选择的.编译器根据您指定的参数数量知道要调用哪一个.
正如其他人所说,匿名函数可能有不同的子句,但它们必须具有相同的元素,因为您只是创建一个函数.
请考虑以下代码:
defmodule Sum do
def sum(x,y) where is_integer(y) do
x + y
end
def sum(x,_) do
x
end
end
Run Code Online (Sandbox Code Playgroud)
这将创建单个sum/2函数的2个子句,并且将调用哪个子句将由模式匹配和保护子句确定,如下所示:
iex> Sum.sum(3,nil)
3
iex> Sum.sum(3,5)
8
iex> Sum.sum(5,:foo)
5
Run Code Online (Sandbox Code Playgroud)
你可以用匿名函数做同样的事情.