はじめに
この記事では、Elixir で min/2
と max/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: for
と cond
を使う
for
と cond
を使う方法もあります:
for n <- -10..20 do
cond do
n < 0 -> 0
n > 10 -> 10
true -> n
end
end
for
ループの中で条件を処理します。わかりやすいですが、cond
の条件が多くなると少し複雑に見えるかもしれません。
パターン 3: min
と max
の組み合わせ
ここで、min
と max
を使ったスマートな方法を試してみます:
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: ネストする方法もアリ!
min
と max
を直接ネストして書く方法もあります:
Enum.to_list(-10..20)
|> Enum.map(&min(max(&1, 0), 10))
ネスト構造でパイプラインを使わずに書くこの方法も十分読みやすいです。お好みに応じて選びましょう!
参考: パイプライン演算子についてもっと知りたい方へ
Elixir のパイプライン演算子について、もっと深く知りたい方には以下の記事がおすすめです:
パイプライン演算子の基本から応用まで、非常にわかりやすく解説されています。ぜひ読んでみてください!
おわりに
この記事では、Elixir の min
と max
を活用して、数値を指定した範囲内に収めるさまざまな方法を紹介しました。
このテクニックは音量調整や値のクリッピングなど、幅広い場面で役立ちます。特にパイプラインと組み合わせると、コードがスッキリして読みやすくなるのが嬉しいポイントですね!
ぜひ、この記事を参考にして実際のプロジェクトでも試してみてください。ご意見やフィードバックはコメントで教えてくださいね!