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


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号