number = 3
case number do
1 -> "match 到 1"
2 -> "match 到 2"
_ -> "1 跟 2 以外的東西"
end
到這邊應該對 case 已經很熟悉了,
不過跟有些語言不同的地方是
這些 case 與接下來要介紹的 if, cond 都一樣是表達式 (expression)
所以會回傳值
這邊舉一個用別的語言概念來寫 Elixir 的錯誤例子
# 錯誤例子
user = %{name: "Jack", vip?: true}
result = nil
case user do
%{vip?: true} -> result = "是 vip"
%{vip?: false} -> result = "不是 vip" # 在 case 裡面的外面拿不到
end
result #=> nil
# 結果這個 result 是第二行的 result 還是 nil
應該寫成
user = %{name: "Jack", vip?: true}
result =
case user do
%{vip?: true} -> "是 vip"
%{vip?: false} -> "不是 vip" # 回傳需要的結果即可
end
result #=> "是 vip"
其實所有的控制流程都可以用 case
解決,但是依據不同的時機,
接下來這幾個語法不僅方便也可以增加可讀性
在 if 後面做真值判斷,除了 nil
與 false
之外,皆為真,
執行並回傳接下來的 do
end
中的程式
name = "Zed"
if name == "Zed" do
"是 Zed,用這個編輯器寫 Elixir 真的很方便"
end
#=> "是 Zed,用這個編輯器寫 Elixir 真的很方便"
這個時候,如果是假,這個 if
語句會回傳 nil
當然也有 else 可以用
name = "Zed"
if name == "Zed" do
"是 Zed!"
else
"是其他的:("
end
Elixir 沒有 else if
不過用 cond 更直覺
cond
會逐一檢查條件是否為真,最早為真的項目回傳
name = "Zed"
opensource = true
cond do
name == "Zed" -> "是 Zed!"
opensource -> "是 opensource 的編輯器"
true -> "是其他的"
end
在定義 cond 時,Elixir 會檢查是不是一定會有結果,
如果前面無法全部涵蓋,可以在最後一個檢查直接寫 true 當作以上皆否的選項
if 與 cond 其實底下都是用 case 實現的,後面的 macro (巨集)篇章會拿這個當範例介紹