iT邦幫忙

2025 iThome 鐵人賽

DAY 8
0

控制流程

case

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"

if

其實所有的控制流程都可以用 case 解決,但是依據不同的時機,
接下來這幾個語法不僅方便也可以增加可讀性

在 if 後面做真值判斷,除了 nilfalse 之外,皆為真,
執行並回傳接下來的 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

cond 會逐一檢查條件是否為真,最早為真的項目回傳

name = "Zed"
opensource = true

cond do
  name == "Zed" -> "是 Zed!"
  opensource -> "是 opensource 的編輯器"
  true -> "是其他的"
end

在定義 cond 時,Elixir 會檢查是不是一定會有結果,
如果前面無法全部涵蓋,可以在最後一個檢查直接寫 true 當作以上皆否的選項

其實都是 case

if 與 cond 其實底下都是用 case 實現的,後面的 macro (巨集)篇章會拿這個當範例介紹


上一篇
匿名函式
下一篇
mix 工具
系列文
通勤看手機就可讀懂的 Elixir 語言入門教學10
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言