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 · 回头拆代码

从第一行往下读

  1. defmodule Village do 开始一个名为 Village 的模块。
  2. def greet(name) 定义公开函数。它的完整名字是 Village.greet/1。
  3. 函数最后一个表达式的值会自动成为返回值,不用写 return。
  4. mix new village 创建项目;进入目录后用 mix test 跑测试,用 iex -S mix 打开已经加载项目的 IEx。
03 · 认清新符号

符号不是暗号

defmodule

开始定义一个模块。

def greet(name)

定义公开函数 greet/1,它接收一个参数。

do ... end

包住模块或函数的代码范围。

04 · 代码里的概念

把名字和意思对上

01

模块

给一组相关函数取一个共同名字,如 Village。

02

源码文件

保存代码的文本文件。Elixir 文件常以 .ex 结尾。

03

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. 1

    模块把相关函数放在一起。

  2. 2

    Elixir 函数会返回最后一个表达式的值。

  3. 3

    Mix 负责创建、编译和测试项目。

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