警衛條款
Guard 子句使我們能夠在執行函式之前檢查引數。由於可讀性,guard 子句通常比 if
和 cond
更受歡迎,並且使編譯器更容易使某種優化技術更容易。執行所有防護匹配的第一個函式定義。
以下是使用保護和模式匹配的階乘函式的示例實現。
defmodule Math do
def factorial(0), do: 1
def factorial(n) when n > 0: do: n * factorial(n - 1)
end
第一個模式匹配 if(且僅當)引數是 0
。如果引數不是 0
,則模式匹配失敗,並檢查下面的下一個函式。
第二個函式定義有一個保護條款:when n > 0
。這意味著只有當引數 n
大於 0
時,此函式才匹配。畢竟,沒有為負整數定義數學因子函式。
如果函式定義(包括它們的模式匹配和保護子句)都不匹配,則會引發 FunctionClauseError
。當我們傳遞一個負數作為引數時,會發生這種情況,因為它沒有為負數定義。
請注意,這個 FunctionClauseError
本身並不是一個錯誤。如某些其他語言中常見的那樣,返回 -1
或 0
或其他一些錯誤值會隱藏你呼叫未定義函式的事實,隱藏錯誤的來源,可能會為未來的開發人員建立一個巨大的痛苦錯誤。