Elixir 具名函数
2023-12-14 17:10 更新
在模块中,我们可以使用
def/2
定义函数,使用defp/2
定义私有函数。由def/2
定义的函数可以被其它模块引用,而私有函数只能在模块内引用。defmodule Math do
def sum(a, b) do
do_sum(a, b)
end
defp do_sum(a, b) do
a + b
end
end
IO.puts Math.sum(1, 2) #=> 3
IO.puts Math.do_sum(1, 2) #=> ** (UndefinedFunctionError)
函数声明也支持卫语句和多重从句。如果一个函数有多个从句,Elicir会逐个尝试知道有一个匹配。下面定义了一个检查数字是否为零的函数:
defmodule Math do
def zero?(0) do
true
end
def zero?(x) when is_integer(x) do
false
end
end
IO.puts Math.zero?(0) #=> true
IO.puts Math.zero?(1) #=> false
IO.puts Math.zero?([1, 2, 3]) #=> ** (FunctionClauseError)
IO.puts Math.zero?(0.0) #=> ** (FunctionClauseError)
对于不匹配任何从句的参数会抛出一个异常。
与if
结构相似,具名函数也支持do:
和do
/end
块语法,我们已经知道do
/end
语法只不过是关键字列表的简写形式。例如,我们可以这样修改math.exs
文件:
defmodule Math do
def zero?(0), do: true
def zero?(x) when is_integer(x), do: false
end
它们效果是一样的。你可以用do:
来写一行的代码,但对于多行代码还是要用do
/end
。
以上内容是否对您有帮助:
更多建议: