轨道
/
Gleam
Gleam
/
练习
/
春季大扫除
春季大扫除

春季大扫除

学习练习

简介

let assert 断言

在 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 断言。

1. 提取错误

每场过去的活动都有一个数组,记录着活动期间发生的问题。它们以结果的形式存储,但始终是Error变体。

实现extract_error函数,它接收一个预期始终为Error的结果,并返回其中包含的错误值。

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,全部免费。