🦬
Elixirの無名関数③:&記法 -- YouTube チャンネル daimon.ex 第7回解説
動画
No.7「Elixir の無名関数③:&記法」
Elixir の 無名関数②:具体的な利用例の続きです。
&記法(アンパーサンド記法)
動画で説明したように、次の2つのElixirの式はまった同じ意味を持ちます:
fn a, b -> a + b end
&(&1 + &2)
2番目の式では &記法 という書き方で無名関数を作り出しています。&(
と )
で囲まれた部分が無名関数の本体となります。関数の本体の中にある &
と数字を組み合わせたもの(&1
と &2
)が、仮引数として解釈されます。
ライブコーディングで使用したソースコード
動画の後半(ライブコーディング)では、次のような Elixir スクリプトを紹介しました。
numbers = [2, 11, -4]
inc = &(&1 + 1)
result = Enum.map(numbers, inc)
IO.inspect(result)
これをターミナル上で実行すると、[3, 12, -3]
という結果が出力されます。
また、上記のスクリプトは次のように変形できます:
numbers = [2, 11, -4]
result = Enum.map(numbers, &(&1 + 1))
IO.inspect(result)
括弧の省略
動画では話しませんでしたが、Elixirの&記法では括弧を省略できます。次の2つはまったく同じ式として解釈されます。
&(&1 + &2)
& &1 + &2
※ 先頭の &
の右にある空白は省略できません。2番目の式を &&1 + &2
と書き換えると、構文エラーとなります。
しかし、2番目の式をElixirの公式フォーマッタでソースコードを整形すると括弧が付けられて、1番目の書き方に変換されます。括弧を付ける方が標準的なのです。
ただし、このルールには例外があります。無名関数の本体が単独のタプルを返すとき、括弧を省略するのが標準的です。例えば、次の無名関数をご覧ください。
fn a, b -> {a, b} end
これを&記法を用いて書き直すと、次のようになりますね。
&({a, b})
しかし、この場合は、次のように括弧を省略すべきです。
&{a, b}
同様に、無名関数の本体が単独のリストや文字列を返すときも、括弧の省略が推奨されます。
&[&1, &2]
&"#{&1}-#{&2}"
これらを&記法を使わずに記述すると、次のようになります:
fn a, b -> [a, b] end
fn a, b -> "#{a}-#{b}" end
Discussion