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 · 回头拆代码
从第一行往下读
Integer.parse/1可能返回整数与剩余文字,也可能返回:error。case把底层结果整理成统一的成功或失败 tuple。with让成功值继续;失败值直接进入else。
03 · 认清新符号
符号不是暗号
case value do按一个值的模式选择子句。
cond do从上到下选择第一条为真的条件。
with pattern <- value do只有匹配成功才继续下一步。
04 · 代码里的概念
把名字和意思对上
控制流
程序根据输入或条件,选择接下来运行哪段代码。
短路
一旦某步失败,后续步骤不再运行,直接处理失败结果。
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
按问题选择控制流工具。
- 2
case擅长模式,cond擅长多条件。 - 3
with让一串可能失败的步骤更清楚。
本课结束代码也跑过一次,就把这一课收好。