cf. 13 alias,requireとimpot – alias, require and import – Elixir
alias
alias
はモジュールに別名をつける。例えば、数学に特化した特殊なリスト操作のモジュールを考えてみる。
defmodule Math do alias Math.List, as: List end
この例では Math.List
モジュールに List
という別名をつけている。List
へのアクセスはすべて Math.List
へと展開される。オリジナルの List
へは Elixir.List
としてアクセスできる。
List.flatten # => Math.List.flatten ELixir.List.flatten # => List.flatten Elixir.Math.List.flatten # => Math.List.flatten
alias
はレキシカルスコープだ。あるモジュールの中で定義した alias
はそのモジュールの中だけで有効。また、特定の関数の中だけで定義することも可能だ。
defmodule Math do def plus(a, b) do alias Math.List, as: List # ... end def minus(a, b) do # ... end end
require
たとえば、Integer.is_odd/1
マクロを使おうという場合、Integer
モジュールをプログラムに読み込まなければならない。それをするのが require
ディレクティブだ。
iex(1)> Integer.is_oss(3) ** (UndefinedFunctionError) function Integer.is_oss/1 is undefined or private. Did you mean one of: * is_odd/1 (elixir) Integer.is_oss(3) iex(1)> require Integer Integer iex(2)> Integer.is_odd(3) true
require
もレキシカルスコープ。
import
ある別のモジュールの関数やマクロを何度も使いたとき、import
すれば装飾名(モジュール名)をつけずに使うことができる。たとえば List
モジュールの duplicate
を何度も使いたいときはこうする:
iex(3)> import List, only: [duplicate: 2] List iex(4)> duplicate(:ok, 3) [:ok, :ok, :ok]
この例では List
モジュールから duplicate/2
だけを import
している。only
は省略可能だけど、つけることが推奨されている。only
の代わりに except
を使うこともできる。only
には :macros
か :functions
を渡すこともできる。:macros
を渡すと、モジュールのすべてのマクロを import
する。import
もレキシカルスコープで、特定の関数内で import
することもできる。
iex(3)> import List, only: [duplicate: 2] List iex(4)> duplicate(:ok, 3) [:ok, :ok, :ok]