14
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【TIPS】Elixirでループのbreak

Last updated at Posted at 2023-12-19

この記事は、Elixir Advent Calendar 2023 シリーズ14 の20日目です


【本コラムは、5分で読め、2分で試せます】

piacere です、ご覧いただいてありがとございます :bow:

Elixirの Enum モジュールって、データ処理をスマートに書ける、Elixirの強力な標準ライブラリなのですが、他言語における break のようなことをするのに悩むことありませんか?

実は、2通りの方法で break が可能なこと、ご存知ですか? … 今回、それをTIPSとしてまとめておきました

小さなデータ向けの break

1~100をループする処理が、5番目で break されていることがお分かりかと思います

1..10
|> Enum.reduce_while([], fn i, acc ->
    if i == 5 do
      {:halt, acc}
    else
      {:cont, acc ++ [i]}
    end
  end)
|> Enum.to_list
結果
[1, 2, 3, 4]

巨大なデータ向けの break

Stream モジュールを使うと、データ全体を読み込まずに実行対象のみ評価するので、巨大なデータの前半で break するときは、Enum.reduce_while よりも有利になります

1..100000000000
|> Stream.transform(0, fn i, acc ->
    if i == 5 do
      {:halt, acc}
    else
      {[i], acc + i}
    end
  end)
|> Enum.to_list
結果
[1, 2, 3, 4]

p.s.

ぶっちゃけ、この7年のプロダクション開発で、break を求められたシーンって無かったから、地味に競プロでしか使わないのでわw :sweat_smile:

ビッグデータで単純なフィルタリングする際は、DB側で処理しちゃいますしね

ちな、私は下記で使いました … 「ズンドコキヨシ」問題なので、やはりプロダクション開発では無いですね

14
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?