(この記事は、「fukuoka.ex x ザキ研 Advent Calendar 2017」の23日目です)
昨日は @hisaway さんの「Elixirで関数の実行速度を測定する」でしたね。
#はじめに
前回は前半として基本的なファイルの作成やコンパイルなどをしました。今回はプライベート関数の定義などをしていきます。また、関数を指す時にname/arityという記法を使用します。
#名前付き関数
def/2やdefp/2を使うことで関数やプライベート関数をモジュール内で定義することができます。ex2.exという名前で以下のファイルを作成しました。
defmodule Math do
def sum(a, b) do
do_sum(a, b)
end
defp do_sum(a, b) do
a + b
end
end
では、実際に実行していきましょう。
def/2で定義した関数は正常に動きましたがdefp/2で定義した関数はエラーが出てしまいました。これはdefp/2で定義した関数はプライベート関数であり制限がかかっているため、モジュールの中でしか呼び出すことができないのです。
iex> Math.sum(1,2)
3
iex> Math.do_sum(1,2)
** (UndefinedFunctionError) function Math.do_sum/2 is undefined or private
Math.do_sum(1, 2)
#関数のキャプチャ
今回使用しているname/arityという記法を名前付き関数の型として使用していきましょう。iexで前回作成したex2.exsを動かします。
$ iex ex2.exs
iex> &is_function/1
&:erlang.is_function/1
iex> (&is_function/1).(fun)
true
iex> fun = &(&1 + 1)
#Function<6.99386804/1 in :erl_eval.expr/5>
iex> fun.(1)
2
このようなキャプチャ構文は関数を作るときのショートカットとしても使えます。&1は関数に渡された最初の引数を表しており、&(&1+1)はfn x -> x + 1 endと同等の意味を持ちます。
#まとめ
今回は前回の続きとして学習していきました。前回と比べて少し難易度が上がったかなと個人的には感じました。初心者の身として勉強を続けて、より理解を深めていく必要があると感じました。
明日は@zuminさんの「」です。お楽しみに。