1
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?

Elixir の min, max とパイプラインでスマートに条件処理

Last updated at Posted at 2024-11-27

はじめに

この記事では、Elixir で min/2max/2 を活用し、パイプラインと組み合わせて簡潔かつ読みやすいコードを書く方法を紹介します。

例えば、音量ボリュームの目盛りが 0 から 10 の場合、値を 0 未満や 10 を超える設定にすることはできません。このような制約を持つ回路を Elixir でどのように表現するかを考えてみます。

数字を範囲内に収める

例えば、次のような数字のリストを考えます:

[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11,
 12, 13, 14, 15, 16, 17, 18, 19, 20]

このリストのすべての要素を次の条件に当てはめたいとします:

  • 値が 0 未満の場合は 0 にする。
  • 値が 10 を超える場合は 10 にする。

最終的に次のようなリストを得ることを目指します:

[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10, 10,
 10, 10, 10, 10, 10, 10]

色んな方法でやってみよう!

パターン 1: Enum.map とガード節

まずは、Enum.map/2 とガード節を使った方法です:

-10..20
|> Enum.to_list()
|> Enum.map(fn
  n when n < 0 -> 0
  n when n > 10 -> 10
  n -> n
end)

ガード節を使って条件を処理しています。シンプルですが、条件が増えると少しコードが長くなりがちです。

パターン 2: forcond を使う

forcond を使う方法もあります:

for n <- -10..20 do
  cond do
    n < 0 -> 0
    n > 10 -> 10
    true -> n
  end
end

for ループの中で条件を処理します。わかりやすいですが、cond の条件が多くなると少し複雑に見えるかもしれません。

パターン 3: minmax の組み合わせ

ここで、minmax を使ったスマートな方法を試してみます:

Enum.to_list(-10..20)
|> Enum.map(fn n -> n |> max(0) |> min(10) end)

max(0) で値を 0 未満にしないようにし、続いて min(10) で値を 10 以下に抑えます。この方法は短くて直感的ですね!

パターン 4: 短く書ける無名関数

さらに簡潔に書く方法もあります:

Enum.to_list(-10..20)
|> Enum.map(& &1 |> max(0) |> min(10))

無名関数を使うことでコードがさらに短くなります。見た目がスッキリしますね。

パターン 5: ネストする方法もアリ!

minmax を直接ネストして書く方法もあります:

Enum.to_list(-10..20)
|> Enum.map(&min(max(&1, 0), 10))

ネスト構造でパイプラインを使わずに書くこの方法も十分読みやすいです。お好みに応じて選びましょう!

参考: パイプライン演算子についてもっと知りたい方へ

Elixir のパイプライン演算子について、もっと深く知りたい方には以下の記事がおすすめです:

パイプライン演算子の基本から応用まで、非常にわかりやすく解説されています。ぜひ読んでみてください!

おわりに

この記事では、Elixir の minmax を活用して、数値を指定した範囲内に収めるさまざまな方法を紹介しました。

このテクニックは音量調整や値のクリッピングなど、幅広い場面で役立ちます。特にパイプラインと組み合わせると、コードがスッキリして読みやすくなるのが嬉しいポイントですね!

ぜひ、この記事を参考にして実際のプロジェクトでも試してみてください。ご意見やフィードバックはコメントで教えてくださいね!

1
0
0

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
1
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?