Gleam 中的陣列是不可變的集合,可容納零個或多個值。陣列中的值必須全部具有相同的型別。由於陣列是不可變的,一旦建立後,它的值就永遠不會改變。任何看似會修改陣列的函式或運算子(例如新增元素),實際上都會回傳一個新的陣列。
陣列可以這樣定義:
let empty = []
let singleValue = [5]
let threeValues = ["a", "b", "c"]
將元素加入陣列最常見的方式是使用展開語法:
let two_to_four = [2, 3, 4]
let one_to_four = [1, ..two_to_four]
// -> [1, 2, 3, 4]
Gleam 標準函式庫中的 gleam/list 模組包含許多處理陣列的實用函式。這個模組在 Gleam 程式碼中非常常用,所以熟悉它很有幫助。
陣列模式可以用在 case 運算式中,比對陣列並將其中包含的值指定給變數:
pub fn describe(list: List(String)) -> String {
case list {
[] -> "Empty list"
[x] -> "List with one item: " <> x
[x, y] -> "List with two items: " <> x <> " and " <> y
_ -> "List with three or more items"
}
}
除了比對確切長度的陣列之外,展開語法也可以用來比對至少有某個長度的陣列:
pub fn describe(list: List(String)) -> String {
case list {
[_, _, ..] -> "List with at least two items"
[_] -> "List with one item"
[] -> "Empty list"
}
}
展開語法也可以用來將陣列其餘的部分指定給一個變數:
pub fn remove_first_item(list: List(String)) -> List(String) {
case list {
// Return the list without the first item
[_, ..rest] -> rest
// There's no first item to remove, return an empty list
_ -> []
}
}
case 運算式應該為被比對型別的每個可能值都有一個模式,因此通常會用最後的丟棄模式(_)來處理剩下的任何值。
在這個練習中,你將撰寫程式碼,追蹤你在 Exercism 上想學習的程式語言陣列。
這個練習有六個任務,全都和處理陣列有關。
為了追蹤你想學習的程式語言,你需要建立一個新的陣列。定義new_list函式,回傳一個全新的空陣列。
new_list()
// -> []
目前你有一張紙,上面寫著你想學習的程式語言:Gleam、Go 和 TypeScript。定義existing_list函式來回傳這個陣列。
existing_list()
// -> ["Gleam", "Go", "TypeScript"]
當你在 Exercism 上探索,發現更多有趣的程式語言時,你會想把它們加進你的陣列。實作add_language函式,把新的程式語言加到陣列的最前面。
add_language(["OCaml", "Elixir"], "Scheme")
// -> ["Scheme", "OCaml", "Elixir"]
一個一個數程式語言很不方便。實作count_languages函式,計算陣列中有多少個程式語言。
count_languages(["jq", "Elm", "Rust", "Kotlin"])
// -> 4
某個時刻,你會發現你的陣列其實是反過來的!實作reverse_list函式來反轉你的陣列。
reverse_list(["Python", "Julia", "Idris", "COBOL"])
// -> ["COBOL", "Idris", "Julia", "Python"]
雖然你喜歡所有的程式語言,但 Gleam 在你心中有個特別的位置。因此,如果符合以下條件,你就會對一串程式語言感到非常興奮:
實作exciting_list函式,檢查一串程式語言是否令人興奮:
exciting_list(["Lua", "Gleam"])
// -> True