你如何找到Ruby的最小/最大值?

问题描述 投票:386回答:5

我想做一些简单明了的事情,比如min(5,10)Math.max(4,7)。 Ruby中有这种功能吗?

ruby enumerable
5个回答
678
投票

你可以做

[5, 10].min

要么

[4, 7].max

他们来自Enumerable module,所以任何包括Enumerable的东西都会有这些方法。

v2.4引入了自己的Array#minArray#max,它们比Enumerable的方法更快,因为它们跳过调用#each

编辑

@nicholasklick提到了另一种选择,Enumerable#minmax,但这次返回了[min, max]阵列。

[4, 5, 7, 10].minmax
=> [4, 10]

51
投票

您可以使用

[5,10].min 

要么

[4,7].max

这是Arrays的一种方法。


22
投票

所有这些结果都会在热心尝试处理两个以上的争论时产生垃圾。我很想知道他们的表现与好的ol相比:

def max (a,b)
  a>b ? a : b
end

这是我对你的问题的官方回答。 :)


20
投票

除了提供的答案之外,如果你想将Enumerable#max转换为可以调用变量数或参数的max方法,就像在其他一些编程语言中一样,你可以写:

def max(*values)
 values.max
end

输出:

max(7, 1234, 9, -78, 156)
=> 1234

这会滥用splat运算符的属性来创建包含所有提供的参数的数组对象,或者如果没有提供参数则使用空数组对象。在后一种情况下,该方法将返回nil,因为在空数组对象上调用Enumerable#max会返回nil

如果要在Math模块上定义此方法,这应该可以解决问题:

module Math
 def self.max(*values)
  values.max
 end
end

请注意,Enumerable.max至少是two times slower compared to the ternary operator (?:)。有关更简单,更快速的方法,请参阅Dave Morse's answer


17
投票

如果你需要找到哈希的最大/最小值,你可以使用#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]
© www.soinside.com 2019 - 2024. All rights reserved.