alias, require, import

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]
カテゴリー: Elixir パーマリンク

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください