學習軌道
/
Gleam
Gleam
/
練習
/
春季大掃除
春季大掃除

春季大掃除

學習練習

簡介

Let 斷言

在 Gleam 中對值進行模式配對時,我們必須確保模式能涵蓋型別中所有可能的值,否則程式碼將無法編譯。

下面這個函式應該被拒絕,因為它沒有處理陣列為空的情況:

pub fn get_first_element_or_crash(items: List(e)) -> e {
  case items {
    [item, ..] -> item
  }
}

在大多數 Gleam 程式裡,我們會想處理所有可能的情況;但有些程式,例如原型和臨時寫的指令碼,可能只想專注在正常路徑上,不為其他情況寫程式碼。這時就輪到 Gleam 的 let assert 登場了。

使用 let 斷言時,模式只需配對型別中某些可能的值;如果模式沒有配對到某個值,程式就會崩潰。用 let assert,我們可以把上面的函式改寫成這樣:

pub fn get_first_element_or_crash(items: List(e)) -> e {
  let assert [item, ..] = items
  item
}

Gleam 函式庫永遠不該使用 let 斷言,因為它們可能讓程式崩潰。相反地,應該使用 Result 型別,讓應用程式的開發者自行決定如何處理錯誤。

說明

活動企劃 Mika 在工作上獲得了升遷,而隨著新的職責,她開始負責活動資料庫。她很快就注意到,許多資料的儲存方式都讓人很難處理,所以你們要合力寫一支一次性的腳本,把它整理乾淨。

由於這支腳本只會執行一次,而且你對資料的結構很有把握,你覺得這裡很適合使用 Gleam 的 let 斷言。

1. 擷取錯誤

每場過去的活動都有一份清單,記錄了活動期間發生的問題。這些問題被存成 result,但它們一律都是Error變體。

實作extract_error函式,它會接受一個預期一律為Error的 result,並回傳其中包含的錯誤值。

extract_error(Error("Not enough coffee"))
// -> "Not enough coffee"

2. 移除團隊前綴

團隊名稱前面被加上了「Team 」這個字,但其實並不需要。實作remove_team_prefix函式,從團隊名稱中移除這個前綴。

remove_team_prefix("Team Turtle")
// -> "Turtle"

3. 拆分地區與團隊

每場活動都由一個團隊負責,而每個團隊都隸屬於一個地區。在資料庫裡,它們被存成同一個字串,並以逗號分隔。

實作split_region_and_team函式,把字串拆成一個由兩個字串組成的元組,一個放地區,一個放團隊。團隊名稱中的「Team 」前綴應該要被移除。

split_region_and_team("East,Team Orange")
// -> #("East", "Orange")
透過 GitHub 編輯 連結會在新視窗或分頁中開啟
Gleam Exercism

準備好開始 春季大掃除 了嗎?

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