Elixir模块基础 #
一、模块定义 #
1.1 基本语法 #
elixir
defmodule Math do
def add(a, b), do: a + b
def subtract(a, b), do: a - b
end
1.2 调用模块函数 #
elixir
iex(1)> Math.add(1, 2)
3
iex(2)> Math.subtract(5, 3)
2
1.3 模块命名 #
elixir
defmodule MyApp.User do
defstruct [:name, :email]
end
defmodule MyApp.Accounts.User do
defstruct [:name, :email, :account_id]
end
1.4 嵌套模块 #
elixir
defmodule MyApp do
defmodule User do
defstruct [:name, :email]
end
defmodule Post do
defstruct [:title, :content, :author]
end
end
二、模块属性 #
2.1 定义属性 #
elixir
defmodule Config do
@app_name "MyApp"
@version "1.0.0"
@author "Developer"
def info do
"#{@app_name} v#{@version} by #{@author}"
end
end
2.2 作为常量 #
elixir
defmodule Math do
@pi 3.14159265359
def circle_area(radius), do: @pi * radius * radius
def circle_circumference(radius), do: 2 * @pi * radius
end
2.3 累积属性 #
elixir
defmodule Router do
@routes []
def route(path, handler) do
@routes [{path, handler} | @routes]
end
def routes, do: @routes
end
2.4 模块文档 #
elixir
defmodule User do
@moduledoc """
User module for managing user data.
This module provides functions for creating, updating,
and validating user records.
## Examples
iex> User.new("Alice", "alice@example.com")
%User{name: "Alice", email: "alice@example.com"}
"""
@doc "Creates a new user"
def new(name, email) do
%{name: name, email: email}
end
end
2.5 类型属性 #
elixir
defmodule User do
@type t :: %__MODULE__{
id: integer(),
name: String.t(),
email: String.t()
}
defstruct [:id, :name, :email]
end
三、别名 #
3.1 基本用法 #
elixir
defmodule MyApp do
alias MyApp.Users.User
def create_user(name, email) do
%User{name: name, email: email}
end
end
3.2 自定义别名 #
elixir
defmodule MyApp do
alias MyApp.Users.User, as: U
def create_user(name, email) do
%U{name: name, email: email}
end
end
3.3 多个别名 #
elixir
defmodule MyApp do
alias MyApp.Users.{User, Profile, Settings}
def create_user(name, email) do
%User{name: name, email: email}
end
def create_profile(user, bio) do
%Profile{user: user, bio: bio}
end
end
四、导入 #
4.1 基本用法 #
elixir
defmodule MyApp do
import Enum
def process(list) do
map(list, fn x -> x * 2 end)
end
end
4.2 仅导入特定函数 #
elixir
defmodule MyApp do
import Enum, only: [map: 2, filter: 2]
def process(list) do
list
|> map(&(&1 * 2))
|> filter(&(&1 > 5))
end
end
4.3 排除特定函数 #
elixir
defmodule MyApp do
import Enum, except: [sort: 1]
def process(list) do
Enum.sort(list)
end
end
4.4 导入宏 #
elixir
defmodule MyApp do
import Kernel, except: [if: 2]
import MyMacros
def example do
my_if true do
"Yes"
end
end
end
五、require #
5.1 基本用法 #
require 用于确保模块已编译,主要用于宏:
elixir
defmodule MyApp do
require Integer
def is_even?(n), do: Integer.is_even(n)
end
5.2 使用宏 #
elixir
defmodule MyMacros do
defmacro say_hello(name) do
quote do
IO.puts("Hello, #{unquote(name)}!")
end
end
end
defmodule MyApp do
require MyMacros
def greet do
MyMacros.say_hello("World")
end
end
六、use #
6.1 基本用法 #
use 调用模块的 __using__/1 宏:
elixir
defmodule MyModule do
defmacro __using__(opts) do
quote do
import MyModule
@my_option unquote(opts[:option])
end
end
def my_function, do: "Hello"
end
defmodule MyApp do
use MyModule, option: "value"
def test do
my_function()
end
end
6.2 常见使用场景 #
elixir
defmodule MyAppWeb do
def controller do
quote do
use Phoenix.Controller, namespace: MyAppWeb
import Plug.Conn
import MyAppWeb.Router.Helpers
end
end
end
defmodule MyAppWeb.UserController do
use MyAppWeb, :controller
def index(conn, _params) do
render(conn, "index.html")
end
end
七、模块嵌套 #
7.1 定义嵌套模块 #
elixir
defmodule Outer do
defmodule Inner do
def hello, do: "Hello from Inner"
end
def hello, do: "Hello from Outer"
end
Outer.hello()
Outer.Inner.hello()
7.2 访问嵌套模块 #
elixir
defmodule Example do
alias Outer.Inner
def test do
Inner.hello()
end
end
八、模块组织最佳实践 #
8.1 文件结构 #
text
lib/
├── my_app/
│ ├── user.ex
│ ├── user/
│ │ ├── profile.ex
│ │ └── settings.ex
│ ├── post.ex
│ └── post/
│ └── comment.ex
└── my_app.ex
8.2 模块命名规范 #
elixir
defmodule MyApp.User do
end
defmodule MyApp.User.Profile do
end
defmodule MyApp.User.Settings do
end
8.3 模块文档规范 #
elixir
defmodule MyApp.User do
@moduledoc """
User management module.
This module provides CRUD operations for users.
## Features
- Create users
- Update users
- Delete users
- Find users
## Examples
iex> user = MyApp.User.create("Alice", "alice@example.com")
iex> user.name
"Alice"
"""
@doc """
Creates a new user.
## Parameters
- `name` - User's name
- `email` - User's email address
## Returns
A new `%User{}` struct.
## Examples
iex> MyApp.User.create("Alice", "alice@example.com")
%User{name: "Alice", email: "alice@example.com"}
"""
def create(name, email) do
%__MODULE__{name: name, email: email}
end
end
九、模块属性列表 #
| 属性 | 用途 |
|---|---|
@moduledoc |
模块文档 |
@doc |
函数文档 |
@spec |
类型规范 |
@type |
类型定义 |
@typep |
私有类型定义 |
@opaque |
不透明类型定义 |
@callback |
回调规范 |
@macrocallback |
宏回调规范 |
@optional_callbacks |
可选回调 |
@behaviour |
行为实现 |
@before_compile |
编译前钩子 |
@after_compile |
编译后钩子 |
@on_definition |
函数定义钩子 |
@external_resource |
外部资源 |
@compile |
编译选项 |
十、总结 #
本章学习了:
| 特性 | 用途 |
|---|---|
defmodule |
定义模块 |
alias |
创建别名 |
import |
导入函数 |
require |
引入宏 |
use |
使用模块宏 |
@attr |
模块属性 |
准备好学习结构体了吗?让我们进入下一章。
最后更新:2026-03-27