1. OverView
OverViewの時間ですが、ElixirSchoolの引用から始めます。
https://elixirschool.com/ja/lessons/basics/modules#alias-3
さて、モジュールと構造体の作り方がわかったので、コンポジションを用いてモジュールや構造体に既存の機能を追加する方法を学びましょう。 Elixirは他のモジュールと連携する様々な方法を用意しています。
今回は、モジュールを取り込んだり、利用したりする話です。
今後もどっかでちらほら見るので、役立つとは思いますが、今日の時点では無理に覚えなくていいんじゃないでしょうか?
今回は、チートシート向きだなぁw
2. まずは解説
2.1 alias
モジュール名をエイリアスすることができます。
defmodule Sayings.Greetings do
def basic(name), do: "Hi, #{name}"
end
このモジュールを外部から使用可能にしますね。
defmodule Example do
alias Sayings.Greetings
def greeting(name), do: Greetings.basic(name)
end
実行してみましょう。
iex(8)> Example.greeting("test")
"Hi, test"
# aliasを使わない場合
defmodule Example do
def greeting(name), do: Sayings.Greetings.basic(name)
end
:as オプションで、別名にaliasも出来ます。
2つのエイリアス間で名前の衝突があったりにも便利ですね。
defmodule Example do
alias Sayings.Greetings, as: Hi
def print_message(name), do: Hi.basic(name) # Greetings.basic/1をHi.basic/1として呼び出している。
end
2.2 import
モジュールをインポートするよりも、関数そのものを自分のモジュールに取り込みたい。
そんな時に使います。
ちょっと、Elixir Schoolの作例を変えてみますね。
iex(11)> List.last([1, 2, 3])
3
iex(12)> import List
List
iex(13)> last([1,2,3])
3
importする前は、List.last/1と呼び出してますが、import語はlastと書くだけで呼び出せてますね。
2.3 フィルタリング
さぁ、みなさんご一緒に、フィルタリング。フィルタリング、ヤッホー!ヤッホー!
…うん、なんかコピペっぽい雰囲気に堪え切れなくなったんです、ごめんなさい。
importはデフォルトでは全ての関数とマクロが取り込まれますが、 :only や :except オプションにより、必要なものだけ取り込めます。
iex(14)> import List, only: [last: 1]
List
iex(15)> first([1, 2, 3]) # 上で、only: lastしかしていないので、失敗する。
error: undefined function first/1 (there is no such import)
iex:15
** (CompileError) cannot compile code (errors have been logged)
iex(15)> last([1, 2, 3])
3
さらに、こんなことも出来るそうです。
「名前/アリティのペアに加えて、 :functions と :macros という2つの特別なアトムもあります。これらはそれぞれ関数とマクロのみを取り込みます」
import List, only: :functions
import List, only: :macros
2.4 require
他のモジュールのマクロを使用することをElixirに伝えるために requireを使えるそうです。
requireはinmportと異なり、マクロを使用可能にします。
defmodule Example do
require SuperMacros
SuperMacros.do_stuff
end
2.5 use
マクロの解説時に説明します。
3. 本日のチートシート
機能の名前 | 説明 | 例 |
---|---|---|
alias | モジュール名をエイリアスすることができます。 | defmodule Sayings.Greetings do def basic(name), do: "Hi, #{name}" end |
:as オプションで、別名にaliasも出来ます。 | defmodule Example do alias Sayings.Greetings, as: Hi def print_message(name), do: Hi.basic(name) # Greetings.basic/1をHi.basic/1として呼び出している。 end |
|
import | 関数そのものを自分のモジュールに取り込む | iex(11)> List.last([1, 2, 3]) 3 iex(12)> import List List iex(13)> last([1,2,3]) 3 |
importはデフォルトでは全ての関数とマクロが取り込まれますが、 :only や :except オプションにより、必要なものだけ取り込めます | iex(14)> import List, only: [last: 1] List iex(15)> first([1, 2, 3]) # 上で、only: lastしかしていないので、失敗する。 error: undefined function first/1 (there is no such import) iex:15 ** (CompileError) cannot compile code (errors have been logged) iex(15)> last([1, 2, 3]) 3 |