min(5,10)
やMath.max(4,7)
のように、単純明快なことをしたいのです。 Rubyにはこの効果に対する機能はありますか?
できるよ
[5, 10].min
または
[4, 7].max
それらは 列挙型モジュール から来ているので、Enumerable
を含むものはすべてこれらのメソッドを利用可能にします。
v2.4では独自のArray#min
とArray#max
が導入されました。これらは#each
の呼び出しをスキップするため、Enumerableのメソッドよりはるかに高速です。
編集
@nicholasklickは別のオプション Enumerable#minmax
について言及していますが、今回は[min, max]
の配列を返します。
[4, 5, 7, 10].minmax
=> [4, 10]
あなたが使用することができます
[5,10].min
または
[4,7].max
これは配列のメソッドです。
これらすべての結果は、3つ以上の引数を処理しようとする熱心な試みでゴミを生成します。私は彼らが善と比較してどのように機能するかを見たいのですが:
def max (a,b)
a>b ? a : b
end
ところで、あなたの質問に対する私の公式の答えです。 :)
提供された答えに加えて、 Enumerable#max を他の方法のように変数番号または引数を呼び出すことができるmaxメソッドに変換する場合プログラミング言語は、あなたが書くことができます:
def max(*values)
values.max
end
出力:
max(7, 1234, 9, -78, 156)
=> 1234
これは、提供されたすべての引数を含む配列オブジェクト、または引数が指定されていない場合は空の配列オブジェクトを作成するためのsplat演算子のプロパティを悪用します。後者の場合、空の配列オブジェクトに対して Enumerable#max を呼び出すとnil
が返されるため、このメソッドはnil
を返します。
Mathモジュールでこのメソッドを定義したい場合は、これでうまくいくはずです。
module Math
def self.max(*values)
values.max
end
end
Enumerable.maxは、3項演算子(?:
)と比較して、少なくとも 2倍遅くなります 。もっと簡単で速い方法については Dave Morseの答え を見てください。
ハッシュの最大値/最小値を探す必要がある場合は、#max_by
または#min_by
を使用できます。
people = {'joe' => 21, 'bill' => 35, 'sally' => 24}
people.min_by { |name, age| age } #=> ["joe", 21]
people.max_by { |name, age| age } #=> ["bill", 35]