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]