LoginSignup
28
26

More than 5 years have passed since last update.

Elixir の require, imoport, use

Last updated at Posted at 2015-07-30

require

モジュールのマクロを読み込む。

require(module, opts)

require MyMacros

import

モジュールのマクロと関数を読み込む。
「モジュール名.」を省略して呼べるようになる。

import(module, opts)

iex> import List
iex> flatten([1, [2], 3])
[1,2,3]

use

モジュールをrequireして、使うための準備処理も行う。(依存関係など)

use(module, opts \ [])

use HelloPhoenix.Web, :router

公式ドキュメント

実質はrequire + __using__ 呼び出し

実質的にはrequireして、さらにそのモジュールの「__using__」マクロを呼ぶ。
「__using__」マクロには、正しいセットアップをするための処理を定義するようになってるみたいです。

use ExUnit.Case, async: true

↓これと同じ

require ExUnit.Case
ExUnit.Case.__using__([async: true])

↓ __using__の例 (主に依存関係を定義するみたい)

extoのmodel.ex
  defmacro __using__(_opts) do
    quote do
      use Ecto.Schema
      import Ecto.Changeset
      import Ecto.Query, only: [from: 2]

      import Ecto.Model
      use Ecto.Model.OptimisticLock
      use Ecto.Model.Timestamps
      use Ecto.Model.Dependent
      use Ecto.Model.Autogenerate
      use Ecto.Model.Callbacks
    end
  end
28
26
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
28
26