Elixir 具名函數(shù)

2023-12-14 17:10 更新
在模塊中,我們可以使用def/2定義函數(shù),使用defp/2定義私有函數(shù)。由def/2定義的函數(shù)可以被其它模塊引用,而私有函數(shù)只能在模塊內(nèi)引用。
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)

函數(shù)聲明也支持衛(wèi)語句和多重從句。如果一個(gè)函數(shù)有多個(gè)從句,Elicir會(huì)逐個(gè)嘗試知道有一個(gè)匹配。下面定義了一個(gè)檢查數(shù)字是否為零的函數(shù):

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)

對于不匹配任何從句的參數(shù)會(huì)拋出一個(gè)異常。

if結(jié)構(gòu)相似,具名函數(shù)也支持do:do/end塊語法,我們已經(jīng)知道do/end語法只不過是關(guān)鍵字列表的簡寫形式。例如,我們可以這樣修改math.exs文件:

defmodule Math do
  def zero?(0), do: true
  def zero?(x) when is_integer(x), do: false
end

它們效果是一樣的。你可以用do:來寫一行的代碼,但對于多行代碼還是要用do/end。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)