Erlang 从零 · 第 07 课(展开目录)
01 · 先打开 erl02 · 先认常见 term03 · 分清两种文字04 · 变量只接一次05 · 拆开一列,再筛一次06 · 把文字安全变成整数07 · 用 case 选一条路08 · 让函数继续走09 · 把代码放进模块10 · 条件必须说真话11 · 一层一层取数据12 · 文字先说清编码13 · 让函数子句排好队14 · 带着累加器往前走15 · 先看值,再选路16 · 给模块立规矩17 · 让 rebar3 管项目18 · 让结果有固定形状19 · 把磁盘当成会失败的邻居20 · 把函数交给 list21 · record 留在院里22 · 先写模块之间的约定23 · 把 term 形状写出来24 · 小测试与整段路25 · 把应用磨成命令26 · 先把小项目圈住27 · 把真实文件洗干净28 · 公开入口越少越稳29 · 把约定留在源码旁30 · 打包,也留下线索31 · 按最初任务交卷
ERLANG · 试跑 · LESSON 0730 分钟

用 case 选一条路

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

01 · 先看完整例子

先用 case 看清分支顺序

把 Score 改成 95 和 40,再分别运行。

Erlang
%% 清掉旧绑定,再设置本次分数
f().
Score = 76.

%% case 从上到下寻找第一个匹配分支
Message =
  case Score of
    Value when Value >= 90 -> very_good;
    Value when Value >= 60 -> pass;
    _Other -> try_again
  end.

%% 查看选中的 atom
Message.
先对照结果
  • 76 得到 atom pass。
  • 95 得到 very_good。
  • 40 得到 try_again。
02 · 回头拆代码

从第一行往下读

  1. case Score of 表示接下来让 Score 与各分支匹配。
  2. 前两个分支后用分号,因为后面还有分支;最后一个分支不加分号。
  3. end. 的句点结束整个 case 表达式。
03 · 认清新符号

符号不是暗号

;

这个 case 分支结束,后面还有分支。

end.

结束整个 case 表达式。

_Other

能匹配任何值;下划线开头表示不会再使用。

04 · 代码里的概念

把名字和意思对上

01

case 分支

针对一种输入形状写的一条规则。第一个匹配分支会被选中。

02

guard

when 后的附加条件,如 when Score >= 60。

03

兜底

最后处理其余输入的分支,避免意外值无人处理。

05 · 再说清楚

这些写法为什么有用

case 先取得一个值,再从上到下寻找第一个匹配分支。

分支之间用分号 ;。最后一个分支后不加分号,整个 case 用 end. 结束。

when 后的 guard 给模式再加一个简单条件。

06 · 自己改一次

合上答案,动手

根据天气 atom 选择动作:rain 返回 umbrella,sunny 返回 hat,其余返回 look_up。

练习起点
%% 清掉刚才的 Score、Message 和旧 Weather
f().

%% 改成其他 atom 再试
Weather = rain.

case Weather of
  ____ -> umbrella;
  ____ -> hat;
  ____ -> look_up
end.

目标结果: rain 得到 umbrella,sunny 得到 hat。

卡住了,再看提示

前两处是固定 atom;最后用 _Other 接住其他值。

运行过以后,再看一种答案
一种答案
%% f() 只在 shell 中使用
f().

%% Weather 是要匹配的 atom
Weather = rain.

case Weather of
  rain -> umbrella;
  sunny -> hat;
  _Other -> look_up
end.
想一想:最后一个 `case` 分支后还要加分号吗?

不要。分号表示后面还有分支;最后一个分支直接接 end.。

带走

记住三句

  1. 1

    case 从上到下选择第一个匹配分支。

  2. 2

    匹配从上到下,顺序会影响结果。

  3. 3

    分号连接分支,end. 结束整个 case。

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