9
2

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/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: & を使ったシンプルな無名関数

無名関数をさらに簡潔に書ける方法として、Elixir でよく使われる & 演算子を活用できます。この方法を使うと、fn を省略してコードを短く書けます。

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

ここでは、fn n -> n |> max(0) |> min(10) end の代わりに、& 演算子を用いて簡略化しています。この & の後に続く &1 は、無名関数の最初の引数を指します。

この方法を使うことで、コードの見た目がスッキリし、簡潔に書けるようになります。

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

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

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

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

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

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

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

おわりに

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

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

9
2
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
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?