🦬

Elixirの無名関数③:&記法 -- YouTube チャンネル daimon.ex 第7回解説

2024/05/28に公開

動画

https://www.youtube.com/watch?v=H-QrwHdTQhg

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