你如何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]