Elixir 从零 · 第 09 课(展开目录)
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 0935 分钟
把代码放进项目
写一个模块,认识 def、文件和 Mix,再走向 BEAM。
01 · 先看完整例子
先在 IEx 试,再保存到 lib/village.ex
IEx 里的定义会随会话结束而消失。进入 Mix 项目后,把同一模块保存进 lib/village.ex。
Elixir
# 模块收好一组相关函数
defmodule Village do
# greet/1 接收名字,返回一句问候
def greet(name) do
"你好,#{name}"
end
end
# 用 模块.函数(参数) 调用
Village.greet("小满")先对照结果
- 模块定义完成后,IEx 显示
{:module, Village, ...}。 - 最后得到
"你好,小满"。
02 · 回头拆代码
从第一行往下读
defmodule Village do开始一个名为Village的模块。def greet(name)定义公开函数。它的完整名字是Village.greet/1。- 函数最后一个表达式的值会自动成为返回值,不用写
return。 mix new village创建项目;进入目录后用mix test跑测试,用iex -S mix打开已经加载项目的 IEx。
03 · 认清新符号
符号不是暗号
defmodule开始定义一个模块。
def greet(name)定义公开函数 greet/1,它接收一个参数。
do ... end包住模块或函数的代码范围。
04 · 代码里的概念
把名字和意思对上
模块
给一组相关函数取一个共同名字,如 Village。
源码文件
保存代码的文本文件。Elixir 文件常以 .ex 结尾。
Mix
Elixir 项目工具。常用命令有 mix new、mix test 和 mix run。
05 · 再说清楚
这些写法为什么有用
IEx 像草稿纸。代码变多后,要把相关函数放进模块,再保存到文件。
defmodule 定义模块,def 定义可以从模块外调用的函数。模块名通常使用大写开头的驼峰写法。
Mix 管理 Elixir 项目。它会创建目录、编译代码、运行测试。Mix 随 Elixir 一起安装,不是第三门语言。
设计选择
为什么这样写
为什么先用模块组织函数,而不是先造 class?
模块给一组相关函数命名并形成公开边界。数据仍是显式参数,不藏在隐含的 this 里。
需要长期状态与生命周期时再引入进程;单纯把函数塞进 GenServer,只会多一层排队。
换一把尺子
从 Java、Python、JavaScript 看过来
Java
- 熟悉的起点
- class 同时装数据、方法和对象身份。
- BEAM 在意什么
- BEAM 模块不是对象;函数没有隐含接收者。
- 别带错直觉
- 模块也不会因为被调用就启动一个进程。
Python
- 熟悉的起点
- module 与 class 都能组织代码。
- BEAM 在意什么
- 这里先让 module/function/arity 成为稳定入口,状态另外安排。
- 别带错直觉
- OTP Application 也不是操作系统进程。
JavaScript
- 熟悉的起点
- ES module 导出函数或 class。
- BEAM 在意什么
- 编译后的模块由 BEAM 按模块名与 arity 调用。
- 别带错直觉
- Mix/rebar3 管项目,不等于 BEAM 或 OTP。
06 · 自己改一次
合上答案,动手
在系统终端创建一个 Mix 项目,跑默认测试,再打开已加载项目的 IEx。
练习起点
# 补上同一个项目目录名
mix new ____
cd ____
# 运行项目自带的测试
mix test
# 打开已经加载这个项目的 IEx
iex -S mix目标结果: 项目目录中会出现 mix.exs、lib/ 和 test/;默认测试通过后,进入项目 IEx。
卡住了,再看提示
两个空都可填写 village_path。这些命令要在系统终端运行,不要输入普通 IEx。
运行过以后,再看一种答案
一种答案
# 创建并进入项目
mix new village_path
cd village_path
# 先跑一次默认测试
mix test
# 以后在这里试项目模块
iex -S mix想一想:Mix 是 BEAM 或另一门编程语言吗?
都不是。Mix 是 Elixir 的项目工具;Elixir 代码仍在 BEAM 上运行。
带走
记住三句
- 1
模块把相关函数放在一起。
- 2
Elixir 函数会返回最后一个表达式的值。
- 3
Mix 负责创建、编译和测试项目。
本课结束代码也跑过一次,就把这一课收好。