在 Gleam 中对值进行模式匹配时,我们必须确保模式覆盖了该类型所有可能的值,否则代码无法编译。
下面这个函数应该被拒绝,因为它没有处理数组为空的情况:
pub fn get_first_element_or_crash(items: List(e)) -> e {
case items {
[item, ..] -> item
}
}
在大多数 Gleam 程序中,我们希望处理所有可能的情况;但在原型、快速脚本这类程序里,我们可能只想关注正常路径,不为其他情况写代码。这时就该 Gleam 的let assert出场了。
使用 let assert,模式可以只匹配某个类型的一部分可能取值,如果模式没有匹配到值,程序就会崩溃。使用let assert,我们可以把上面的函数写成这样:
pub fn get_first_element_or_crash(items: List(e)) -> e {
let assert [item, ..] = items
item
}
Gleam 库永远不应使用 let assert 断言,因为它们可能导致程序崩溃。库应该改用Result类型,让应用开发者自己决定如何处理错误。
活动策划人 Mika 升职了,作为新职责的一部分,她现在负责活动数据库。她很快发现,很多数据的存储方式都很难处理,于是你们组队,用一个一次性脚本把这些数据整理干净。
由于这个脚本只会运行一次,而且你对数据的结构很有把握,你觉得这里很适合使用 Gleam 的 let 断言。
每场过去的活动都有一个数组,记录着活动期间发生的问题。它们以结果的形式存储,但始终是Error变体。
实现extract_error函数,它接收一个预期始终为Error的结果,并返回其中包含的错误值。
extract_error(Error("Not enough coffee"))
// -> "Not enough coffee"
团队名称前面都加上了“Team ”这个前缀,但这并不需要。实现remove_team_prefix函数,从团队名称中移除这个前缀。
remove_team_prefix("Team Turtle")
// -> "Turtle"
每场活动都由一个团队负责,每个团队都属于一个地区。在数据库中,它们存储在一个字符串里,用逗号分隔。
实现split_region_and_team函数,把这个字符串拆分成一个包含两个字符串的元组,一个表示地区,一个表示团队。团队名称中的“Team ”前缀应该被移除。
split_region_and_team("East,Team Orange")
// -> #("East", "Orange")