あふことの絶えてしなくばなかなかに人をも身をも恨みざらまし
Advent Calendar 2022 96日目1の記事です。
I'm looking forward to 12/25,2022
私のAdvent Calendar 2022 一覧。
はじめに
Elixirを楽しんでいますか
今日はEnum.slide/3について書きます。
Enum.slide/3
Elixir 1.13 or laterです。
公式の説明をそのまま載せます。
ざっくり言うとスライドさせる関数です。
私には難解でした。
Examples
例はひとつひとつ説明してみます。
リストは0オリジン(はじまり)です。
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 5, 1)
[:a, :f, :b, :c, :d, :e, :g]
indexが5の要素つまり:f
をindex 1にいれます。
残りはスライドさせます。
うん、わかったね。
次行こう! 次!
# Slide a range of elements backward
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..5, 1)
[:a, :d, :e, :f, :b, :c, :g]
今度はRangeで指定です。
indexが3から5の要素つまり、[:d, :e, :f]
をindex 1の位置にずらしています。
# Slide a range of elements forward
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 1..3, 5)
[:a, :e, :f, :b, :c, :d, :g]
今度もRangeの指定です。
indexが1から3の要素つまり、[:b, :c, :d]
をindex 5の位置にずらしています。
# Slide with negative indices (counting from the end)
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..-1//1, 2)
[:a, :b, :d, :e, :f, :g, :c]
今度もRangeの指定です。
indexが3から末尾の要素つまり、[:d, :e, :f, :g]
をindex 2の位置にずらしています。
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], -4..-2, 1)
[:a, :d, :e, :f, :b, :c, :g]
今度もRangeの指定です。
indexが末尾が-1ですから-4..-2
ってのはつまり[:d, :e, :f]
ををindex 1の位置にずらしています。
# Insert at negative indices (counting from the end)
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3, -1)
[:a, :b, :c, :e, :f, :g, :d]
indexが3の要素つまり:d
を末尾にずらしています。
改めてEnum.slide/3の各引数の意味は以下の通りです。
- 第1引数は、enumerable
- 第2引数は、range_or_single_index
- 第3引数は、insertion_index
以下はエラーになります。
iex> Enum.slide([:a, :b, :c, :d, :e, :f, :g], 3..5, 4)
** (RuntimeError) Insertion index for slide must be outside the range being moved (tried to insert 3..5 at 4)
(elixir 1.13.1) lib/enum.ex:2619: Enum.slide/3
実装が気になる方は以下をご参照くださいませ。
プルリクはこちらです。
The classic use case is this: Suppose you have a list of to-do items, which the user has ordered by priority:
- Apply to college
- Brush the dog
- Change the car's oil
- Deliver flowers
- Exchange gifts
Wrapping up
今日は、Enum.slide/3を楽しんでみました。
私は動きを追うことで精一杯でした。
きっとどこかで使う場面がくるのでしょう。
こんなとき使ったよ! という事例をお持ちのかたはぜひお便り(コメント)をください。
Enjoy Elixir
$\huge{Enjoy\ Elixir🚀}$
以上です。
I organize autoracex.
And I take part in NervesJP, fukuoka.ex, EDI, tokyo.ex, Pelemay.
I hope someday you'll join us.
We Are The Alchemists, my friends!
We appreciate this shoutout, Torifuku! pic.twitter.com/dThmJg4CYN
— ClickUp (@clickup) April 11, 2022