Elixir 从零 · 第 06 课(展开目录)
01 · 先让代码说话02 · 先认六种值03 · 把值装起来04 · 从旧 list 生成新 list05 · 让形状对上06 · 用 case 做选择07 · 把文字安全变成整数08 · 拆开 &1 和管道09 · 把代码放进项目10 · 真假不只靠 true11 · 走进嵌套数据12 · 一字不一定一字节13 · 让函数按形状接活14 · 把一列数收成一个值15 · 给不同问题选不同路16 · 给 map 一张名片17 · 让项目自己验答案18 · 让成功和失败长得一样19 · 读写文件先管好路20 · 只算眼前需要的21 · 同一句话,不同做法22 · 先约好模块会做什么23 · 把数据形状写在门口24 · 测试不只看一条好路25 · 把项目磨成一个命令26 · 定下小项目边界27 · 把真实文字洗干净28 · 只开三扇门29 · 把约定钉在代码旁30 · 打包,也留下脚印31 · 照任务书交卷
ELIXIR · 试跑 · LESSON 0625 分钟

用 case 做选择

让一个值依次匹配分支,再用 guard 补充条件。

01 · 先看完整例子

按分数给出一句话

把 score 改成 95 和 40,各运行一次。

Elixir
# case 从上到下选择第一个匹配分支
score = 76

message =
  case score do
    value when value >= 90 -> "很稳"
    value when value >= 60 -> "过关"
    _value -> "再试一次"
  end

message
先对照结果
  • 76 得到 "过关"。
  • 95 得到 "很稳"。
  • 40 得到 "再试一次"。
02 · 回头拆代码

从第一行往下读

  1. case score do 表示接下来要检查 score。
  2. 分支从上到下尝试,所以 >= 90 要放在 >= 60 前面。
  3. _value 能接住任何剩余值。下划线开头提醒我们不会再使用它。
03 · 认清新符号

符号不是暗号

->

左边条件成立时,运行右边表达式。

when

在模式之后再加一个条件。

_

最后的兜底分支,接住前面没有处理的值。

case ... do ... end

do 打开分支块,end 结束整个 case。

04 · 代码里的概念

把名字和意思对上

01

分支

根据输入选择一段代码运行。

02

case

把一个值与多个模式依次匹配,运行第一个匹配的分支。

03

guard

跟在 when 后的附加条件,如 when score >= 60。

05 · 再说清楚

这些写法为什么有用

程序常要看情况做事。case 先取得一个值,再让它依次与多个模式匹配。

每个分支都写“什么输入”与“返回什么”。第一个匹配的分支运行,后面的不再检查。

guard 是写在模式后的小条件。它只允许一组安全、明确的判断函数。

06 · 自己改一次

合上答案,动手

根据天气 atom 返回动作::rain 带伞,:sunny 戴帽子,其他情况先看天空。

练习起点
# 改成其他 atom 再试
weather = :rain

case weather do
  ____ -> "带伞"
  ____ -> "戴帽子"
  ____ -> "先看天空"
end

目标结果: :rain 得到 "带伞",:sunny 得到 "戴帽子"。

卡住了,再看提示

前两处填固定 atom,最后用下划线接住其他值。

运行过以后,再看一种答案
一种答案
# weather 是要匹配的值
weather = :rain

case weather do
  :rain -> "带伞"
  :sunny -> "戴帽子"
  _other -> "先看天空"
end
想一想:为什么 `value >= 90` 要放在 `value >= 60` 前面?

因为 case 选择第一个匹配分支。95 也大于 60;顺序反过来时,95 会过早进入“过关”分支。

带走

记住三句

  1. 1

    case 擅长把模式匹配和选择放在一起。

  2. 2

    分支顺序会影响结果。

  3. 3

    用兜底分支说明其他输入怎么办。

本课结束代码也跑过一次,就把这一课收好。