Elixir の require, imoport, use

More than 3 years have passed since last update.


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