Erlang 从零 · 第 10 课(展开目录)
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 1025 分钟

条件必须说真话

比较 term,组合布尔条件,分清相等与严格相等。

01 · 先看完整例子

在 erl 判断能否买书

在 shell 中分三段运行,注意每段最后的句点。

Erlang
Price = 36,
Balance = 50,
InStock = true,

%% 两边都必须得到布尔值
case Balance >= Price andalso InStock of
  true -> can_buy;
  false -> wait
end.

%% 数值相等,但类型不严格相同
1 == 1.0.
1 =:= 1.0.
先对照结果
  • 购买判断得到 can_buy。
  • 1 == 1.0 是 true;1 =:= 1.0 是 false。
02 · 回头拆代码

从第一行往下读

  1. >= 先产生 true 或 false。
  2. andalso 只在左边为真时检查右边。
  3. 需要区分整数与浮点数时使用严格相等。
03 · 认清新符号

符号不是暗号

== / =:=

前者做数值宽松比较,后者做严格比较。

andalso / orelse

短路组合布尔条件。

=/=

严格不相等。

04 · 代码里的概念

把名字和意思对上

01

布尔条件

结果必须是 atom true 或 false 的判断。

02

严格相等

=:= 同时比较值与类型。

05 · 再说清楚

这些写法为什么有用

Erlang 的条件不是“差不多为真”就行。if guard 和 andalso 等布尔运算期待真正的 true 或 false。

== 比较数值时允许整数与浮点数相等;=:= 还要求类型相同。

andalso、orelse 会短路。前面已经能决定答案时,后面的表达式不会运行。

06 · 自己改一次

合上答案,动手

年龄不少于 12 且有票时返回 enter。

练习起点
Age = 13,
HasTicket = true,
case ____ andalso ____ of
  true -> enter;
  false -> stop
end.

目标结果: 得到 enter。

卡住了,再看提示

两个条件是 Age >= 12 与 HasTicket。

运行过以后,再看一种答案
一种答案
Age = 13,
HasTicket = true,
%% 两个条件同时为 true
case Age >= 12 andalso HasTicket of
  true -> enter;
  false -> stop
end.
想一想:数字 `0` 能直接当成 Erlang 的 `if` 条件吗?

不能。Erlang 没有把 0、空 list 等值自动换成真假;条件应明确得到 true 或 false。

带走

记住三句

  1. 1

    条件要明确返回布尔值。

  2. 2

    == 与 =:= 的严格程度不同。

  3. 3

    andalso 与 orelse 会短路。

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