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