你如何findRuby的最小/最大值?

我想要做一些简单而直接的事情,比如min(5,10)Math.max(4,7) 。 在Ruby中有这个function吗?

你可以做

 [5, 10].min 

要么

 [4, 7].max 

它们来自Enumerable模块 ,所以包含Enumerable任何东西都可以使用这些方法。

编辑

@nicholasklick提到了另一个选项Enumerable#minmax ,但是这次返回一个[min, max]的数组。

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

在初始数组中只有2个值似乎不是很有趣,所以

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

您可以使用

 [5,10].min 

要么

 [4,7].max 

这是一个arrays的方法。

所有这些结果都会在处理两个以上的论据时产生垃圾。 我很想知道他们的performance如何,而不是好的“

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

这是我的官方回答你的问题。 🙂

除了提供的答案之外,如果要将Enumerable#max转换为可以调用variables数或参数的最大方法,就像其他一些编程语言一样,可以这样编写:

 def max(*values) values.max end 

输出:

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

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

如果你想在math模块上定义这个方法,这应该是诀窍:

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

请注意,Enumerable.max至less比三元运算符( ?: :)慢两倍 。 请参阅戴夫莫尔斯的答案更简单,更快的方法。

如果您需要查找散列的最大/最小值,则可以使用#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]