警衛條款

Guard 子句使我們能夠在執行函式之前檢查引數。由於可讀性,guard 子句通常比 ifcond 更受歡迎,並且使編譯器更容易使某種優化技術更容易。執行所有防護匹配的第一個函式定義。

以下是使用保護和模式匹配的階乘函式的示例實現。

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 本身並不是一個錯誤。如某些其他語言中常見的那樣,返回 -10 或其他一些錯誤值會隱藏你呼叫未定義函式的事實,隱藏錯誤的來源,可能會為未來的開發人員建立一個巨大的痛苦錯誤。