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