Elixir 允許函式擁有多個子句,藉此實踐開放封閉原則。所以與其寫出龐雜、寫死的控制邏輯,不如把函式寫得更聚焦,就能輕鬆地新增或移除行為。
Elixir 提供了_多重函式子句_與_警衛_,讓你寫出:
def number(n) when n == 7 do
"Awesome, that's my favorite"
end
def number(_n) do
"That's not my favorite"
end
在執行時,Elixir 會從原始檔的頂端往下依序檢查,決定要呼叫哪一個函式子句。
未使用的變數應該以底線作為前綴。
警衛用來防止 Elixir 呼叫函式,判斷的依據是警衛函式對引數的求值結果。警衛以when關鍵字開頭,後面接著一個布林運算式。警衛函式是特殊的函式,它們:
true或false值。常見的警衛清單可以在 Elixir 文件 中找到。其中包括型別檢查、基本算術、比較,以及嚴格的布林運算子。
函式可以為一個或多個引數宣告預設值。我們來看看這個函式吧:
def number(n \\ 13), do: "That's not my favorite"
編譯時,Elixir 會建立number/0(沒有引數)和number/1(一個引數)兩個函式定義。
如果多個引數都有預設值,這些預設值會由左至右套用到函式,補上缺少的引數。
如果函式有多個子句,預設引數應該定義在函式子句之前的函式標頭(沒有主體的函式)中:
def number(n \\ 13)
def number(n) when n < 10, do: "Dream bigger!"
def number(n) when n > 100, do: "Not that big..."
你正在建立一個簡單的線上遊戲,讓朋友可以猜一個秘密數字。你想提供一些回饋,但又不想因為一次猜測就洩漏答案。你需要設計一個函式,根據猜測與秘密數字之間的關係,提供不同的回應。
| 條件 | 回應 |
|---|---|
| 當猜測與秘密數字相符時 | "Correct" |
| 當猜測比秘密數字多一或少一時 | "So close" |
| 當猜測大於秘密數字時 | "Too high" |
| 當猜測小於秘密數字時 | "Too low" |
| 當沒有進行猜測時 | "Make a guess" |
所有猜測和秘密數字都是整數。
實作compare/2函式,它接受兩個引數:secret_number和guess,兩者都是整數。
GuessingGame.compare(5, 5)
# => "Correct"
修改compare函式,讓它能回應高於秘密數字的猜測。
GuessingGame.compare(5, 8)
# => "Too high"
修改compare函式,讓它能回應低於秘密數字的猜測。
GuessingGame.compare(5, 2)
# => "Too low"
修改compare函式,讓它能回應接近秘密數字的猜測。
GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"
修改compare函式,讓它能回應沒有猜測的情況。
GuessingGame.compare(5)
# => "Make a guess"
GuessingGame.compare(5, :no_guess)
# => "Make a guess"