スポンサーリンク

2015年10月1日

[Elixir]alias, require, import, useの使い方を学ぶ

とある錬金術師の万能薬(Elixir)

Goal

alias、require、import、useの使い方を学ぶ。

Dev-Environment

OS: Windows8.1
Erlang: Eshell V6.4, OTP-Version 17.5
Elixir: v1.0.5

Wait a minute

今更ですが、alias、require、import、useの違いを学びます。
それぞれ、どんな機能なのか把握すれば特段難しいこともないですね。

Index

alias, require, import, use
|> alias
|> import
|> require
|> use

alias

モジュールへ別名を付ける時に使います。

Exmaple:

defmodule AliasSample.Sample.Hoge do
  ...
end

defmodule AliasSample.Sample.Huge do
  alias AliasSample.Sample.Hoge, as: Hoge
end

Note:

asオプションをなしで別名定義をすると、モジュール名の最後の部分が自動的に設定されます。
以下は同じ意味になります。
alias AliasSample.Sample.Hoge, as: Hoge == alias AliasSample.Sample.Hoge

import

他のモジュールにある関数やマクロを修飾名をつけないで呼び出す時に使います。

Exmaple:

iex> count([1,2,3])
** (RuntimeError) undefined function: count/1
iex> import Enum, only: [count: 1]
nil
iex> count([1,2,3])
3

Note:

onlyオプションを使えば特定の関数だけ対象にできる。
ない場合は、importしたモジュール全ての関数が対象になる。

require

マクロを展開させる時に使います。

Exmaple:

defmodule RequireSample do
  defmacro sample(arg1, arg2) do
    quote do
      ...
    end
  end
end

iex> RequireSample.sample(arg1, arg2)
エラーが発生し、requireしろとメッセージが表示される。
iex> require RequireSample
nil
iex> RequireSample.sample(arg1, arg2)
正常に実行される。

Note:

マクロを使うためには、コンパイル時にそのモジュールと実装が用意されている必要がある。

use

モジュールのusingを展開させます。

Exmaple:

defmodule UsingSample do
  defmacro __using__(_options) do
    quote do
      ...
      import unquote(__MODULE__)
      ...
    end
  end

  ...
end

defmodule UseSample do
  use UsingSample
end
上記の場合、UsingSample.using/1がUseSampleのuseしている場所で展開されます。

Speaking to oneself

散々ここら辺の機能を使っておいて…よく分かってなかったので、
簡単にまとめてみました。

Bibliography

人気の投稿