Elixir 从零 · 第 15 课(展开目录)
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 1535 分钟

给不同问题选不同路

按数据形状选 `case`,按条件选 `cond`,按结果串联选 `with`。

01 · 先看完整例子

解析后再判断年龄

把 "13" 改为 "十三",观察失败怎样提前返回。

Elixir
parse_age = fn text ->
  case Integer.parse(text) do
    {age, ""} -> {:ok, age}
    _ -> {:error, :bad_age}
  end
end

# with 只在得到 {:ok, age} 时进入正文
with {:ok, age} <- parse_age.("13") do
  cond do
    age < 12 -> {:ok, :child}
    true -> {:ok, :teen_or_adult}
  end
else
  error -> error
end
先对照结果
  • "13" 得到 {:ok, :teen_or_adult}。
  • "十三" 得到 {:error, :bad_age}。
02 · 回头拆代码

从第一行往下读

  1. Integer.parse/1 可能返回整数与剩余文字,也可能返回 :error。
  2. case 把底层结果整理成统一的成功或失败 tuple。
  3. with 让成功值继续;失败值直接进入 else。
03 · 认清新符号

符号不是暗号

case value do

按一个值的模式选择子句。

cond do

从上到下选择第一条为真的条件。

with pattern <- value do

只有匹配成功才继续下一步。

04 · 代码里的概念

把名字和意思对上

01

控制流

程序根据输入或条件,选择接下来运行哪段代码。

02

短路

一旦某步失败,后续步骤不再运行,直接处理失败结果。

05 · 再说清楚

这些写法为什么有用

控制流不是越多越好。先问自己在判断什么:值的形状、多个条件,还是连续步骤。

case 适合匹配一个结果的不同形状。cond 适合从多条布尔条件中选第一条真规则。

with 适合串联多个可能失败的 {:ok, value} 步骤。任一步不匹配,就把那个值交给 else。

06 · 自己改一次

合上答案,动手

补全 case,让空 list 返回 :empty,非空 list 返回第一项。

练习起点
case [8, 9] do
  ____ -> :empty
  [head | _] -> ____
end

目标结果: 得到 8。

卡住了,再看提示

空 list 的模式是 [];第二处返回 head。

运行过以后,再看一种答案
一种答案
case [8, 9] do
  [] -> :empty
  # 非空 list 的 head 是第一项
  [head | _] -> head
end
想一想:只有一个简单真假条件时,一定要使用 `cond` 吗?

不用。简单真假分支用 if 更直接;cond 留给多条条件。

带走

记住三句

  1. 1

    按问题选择控制流工具。

  2. 2

    case 擅长模式,cond 擅长多条件。

  3. 3

    with 让一串可能失败的步骤更清楚。

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