6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ElixirAdvent Calendar 2024

Day 22

Elixirのチートシートを作ろう #16 モジュールその2

Last updated at Posted at 2024-12-21

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

4. 本日の課題

4.1 require, useの説明 マクロ説明後にやること

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?