學習軌道
/
Elixir
Elixir
/
練習
/
猜數字遊戲
猜數字遊戲

猜數字遊戲

學習練習

簡介

多重子句函式

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"

所有猜測和秘密數字都是整數。

1. 當猜測與秘密數字相符時,產生回應

實作compare/2函式,它接受兩個引數:secret_number和guess,兩者都是整數。

GuessingGame.compare(5, 5)
# => "Correct"

2. 當猜測大於秘密數字時,產生回應

修改compare函式,讓它能回應高於秘密數字的猜測。

GuessingGame.compare(5, 8)
# => "Too high"

3. 當猜測小於秘密數字時,產生回應

修改compare函式,讓它能回應低於秘密數字的猜測。

GuessingGame.compare(5, 2)
# => "Too low"

4. 當猜測比秘密數字多一或少一時,產生回應

修改compare函式,讓它能回應接近秘密數字的猜測。

GuessingGame.compare(5, 6)
# => "So close"
GuessingGame.compare(5, 4)
# => "So close"

5. 當沒有猜測時,產生回應

修改compare函式,讓它能回應沒有猜測的情況。

GuessingGame.compare(5)
# => "Make a guess"

GuessingGame.compare(5, :no_guess)
# => "Make a guess"
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Elixir Exercism

準備好開始 猜數字遊戲 了嗎?

註冊 Exercism,透過 58 個概念168 個練習 和真人引導來學習並精通 Elixir,全部免費。