在 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