Elixirで、引数を一つとり`:pop`を返す関数をみなさんはどう書きますか?
解決したいこと
Elixirで、引数を一つとり:pop
を返す関数を書きたいです。
この書き方で目的は果たせます。
fn _value -> :pop end
上記以外の他の書き方はありますでしょうか。
特に&記法での書き方はできますでしょうか。
なぜそんなことをしたいの?
Kernel.get_and_update_in/3 で、三番目の引数fun
が:pop
を返すようにしたいです。
fun
は以下の関数が求められています。
公式ドキュメントから抜粋します。
The fun argument receives the value of key (or nil if key is not present) and must return one of the following values:
- a two-element tuple {current_value, new_value}. In this case, current_value is the retrieved value which can possibly be operated on before being returned. new_value is the new value to be stored under key.
- :pop, which implies that the current value under key should be removed from the structure and returned.
日本語でポイントのみ書いてみます。
第2引数keys
で指定されたキーに対応する値が関数に渡されます。
その関数は、次の2つのうちいずれかを返す必要があります。
- ①
{current_value, new_value}
- ②
:pop
前置きが長くなりました。
四の五の言わずに、Kernel.get_and_update_in/3の実行例をみてみます。
①{current_value, new_value}
まずは①番目の{current_value, new_value}
を返す関数を指定する方法をみてみます。
iex> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
%{"john" => %{age: 27}, "meg" => %{age: 23}}
iex> get_and_update_in(users, ["john", :age], &{&1, &1 * 1000})
{27, %{"john" => %{age: 27000}, "meg" => %{age: 23}}}
上を実行してももちろん、users
の値が書き換わっているわけではないです。
iex> users
%{"john" => %{age: 27}, "meg" => %{age: 23}}
②:pop
次に②番目の:pop
を返す関数を指定する方法をみてみます。
iex> users = %{"john" => %{age: 27}, "meg" => %{age: 23}}
%{"john" => %{age: 27}, "meg" => %{age: 23}}
iex> get_and_update_in(users, ["john", :age], fn _value -> :pop end)
{27, %{"john" => %{}, "meg" => %{age: 23}}}
fn _value -> :pop end
この書き方を&記法等、他の書き方はないのかな〜 という質問です。
自分で試したこと
なんとなく、fn _value -> :pop end
しか書きようがないようにおもっています。
ただ、私の思い込みかもしれないのと、Qiitaの質問投稿を初めてやってみようとおもった次第です。
ご回答お待ちしております。
Thanks for your time.
Advent Calendar 2022
Advent Calendar 2022 23日目[^1]の記事です。
I'm ready for 12/25,2022
I'm looking forward to 12/25,2022
I can't wait for 12/25,2022
私のAdvent Calendar 2022 一覧。
Elixirを楽しんでいますか
$\huge{Enjoy\ Elixir🚀}$