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

把值装起来

用 list、tuple 和 map 收好一组数据。

01 · 先看完整例子

三种集合,三种用途

同样是“装多个值”,取值方式并不相同。

Elixir
# list 保留先后顺序
hd(["桃", "李", "杏"])

# tuple 把状态和数据放在一起
elem({:ok, 42}, 1)

# map 用名字寻找值
%{name: "阿青", score: 92}.score
先对照结果
  • hd(["桃", "李", "杏"]) 得到第一个值 "桃"。
  • elem({:ok, 42}, 1) 得到 42;位置从 0 开始数。
  • map 后的 .score 读出 92。
02 · 回头拆代码

从第一行往下读

  1. hd(["桃", "李", "杏"]) 读取非空 list 的第一个元素。这里先不要把它用于空 list。
  2. elem({:ok, 42}, 1) 的 1 是位置。tuple 的第一个位置编号是 0。
  3. 当 map 的 key 是 atom 时,可以在 map 后用 .score 读取它。
03 · 认清新符号

符号不是暗号

[ ]

方括号包住 list。

{ }

花括号包住 tuple。

%{key: value}

百分号加花括号表示 map;冒号左边是 key。

04 · 代码里的概念

把名字和意思对上

01

list

方括号里的有序集合,如 ["桃", "李"]。适合依次处理。

02

tuple

花括号里的固定组合,如 {:ok, 200}。常表示几个值共同组成一个结果。

03

map

按 key 找 value 的集合,如 %{name: "阿青"}。

05 · 再说清楚

这些写法为什么有用

一个值不够时,可以把多个值装进集合。购物清单有先后顺序,适合 list。一次操作的结果和状态,常放在 tuple 里。

map 用名字找值。学生记录里,:name 对应姓名,:score 对应分数。读代码的人不用猜第几个位置是什么。

先学会读和取值。更新集合的写法以后再学。

06 · 自己改一次

合上答案,动手

建立一本书的 map,放入书名和页数,再读出页数。

练习起点
# 补上两个 key,再用点号读页数
%{____: "西游记", ____: 100}.____

目标结果: 最后得到 100。

卡住了,再看提示

可以使用 title 和 pages 两个 key。

运行过以后,再看一种答案
一种答案
# map 用有名字的 key 保存资料
# atom key 可以用点号读取
%{title: "西游记", pages: 100}.pages
想一想:姓名和分数应该放进 `["阿青", 92]`,还是 `%{name: "阿青", score: 92}`?

初学时优先用 map。name 和 score 把每个值的意思写清楚了。

带走

记住三句

  1. 1

    list 适合一串按顺序处理的值。

  2. 2

    tuple 常把状态和结果绑在一起。

  3. 3

    map 用 key 说明每个值是什么。

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