モジュールと関数
Elixirは関数型言語です.関数型言語とは,プログラムを関数の塊として表現する言語のことです.関数を明示的に定義しなくても処理を書くことはできますが,プログラムが大きくなれば関数を分割して見通しをよくする必要が出てくるでしょう.ここではその方法を解説します.
モジュール
Elixirでは関連する関数をグループ化してモジュールとして管理します.
- 処理を行う対象となるデータごとにモジュールを分割する事が多いです
- e.g.) 文字列を処理する
String
モジュールなど
- e.g.) 文字列を処理する
- モジュールは階層化することができます
(名前付き)関数
モジュール配下に記述する関数を名前付き関数と言います.慣習的にsnake_caseを使用します.以下のように定義します.
defmodule Math do
def add(a, b) do
a + b # 関数の最終行が関数の戻り値となります
end
end
モジュール外から参照することの出来ないプライベートな関数も定義することが出来ます.
defmodule Math do
def add(a, b) do
_add(a, b)
end
defp _add(a, b) do
a + b
end
end
Elixirでは特定の関数の名前を記述するときには,引数の数を添えて記載します.例えば,helloという変数に束縛された文字列の文字数を取得したい場合,String.length(hello)
と書きますが,これを実行する関数名はString.length/1
といった具合です.
この名前は高階関数に関数を引数として与える場合にも使います.その場合は&
が頭文字として必要になります.
iex> do_something(some_string, &String.length/1) # 良い例が思いつかなかっただけなので,細かい意味は考えないでください
無名関数
その名の通り,名前無しの関数です.関数の引数として関数を渡す場合(高階関数とよぶ)などによく用いられます.
iex> fn a, b -> a + b end # 引数aとbを加算する関数
#Function<43.97283095/2 in :erl_eval.expr/5> # iexでは関数を表すハッシュが表示されます
無名関数はそれ自体を変数に束縛することが出来ます.束縛した無名関数を実行する場合には,変数名の後に.
を付けて括弧で引数を囲みます.
iex> add = fn a, b, c -> a + b + c end
iex> add.(1, 2, 3)
6
また,引数が1つ以上の場合には省略記法を用いる事も出来ます.
iex> &(&1 + &2 + &3) # 「fn a, b, c -> a + b + c end」と同じ
&
に続く数字が引数の番号に対応しています.
練習問題
第1引数,第2引数に数字,第3引数に引数を2つとる関数をとり,第1引数と第2引数をそれぞれ第3引数の関数へ渡して実行する関数を作ってみましょう.(
fn
を使う記法と&
を使う記法と両方で作ってみましょう)出力例: iex> add = &(&1 + &2) # 準備 iex> func.(1, 2, add) # funcに適切な関数が拘束されていれば1と2を使ってaddを実行できる 3 iex> mul = &(&1 * &2) # 準備 iex> func.(5, 6, mul) # funcに適切な関数が拘束されていれば1と2を使ってmulを実行できる 30