obu*_*zek 401 ruby enumerable
我想做一些简单明了的事情,比如min(5,10)
,或者Math.max(4,7)
.Ruby中有这种功能吗?
the*_*eIV 697
你可以做
[5, 10].min
Run Code Online (Sandbox Code Playgroud)
要么
[4, 7].max
Run Code Online (Sandbox Code Playgroud)
它们来自Enumerable模块,因此包含的任何内容Enumerable
都将提供这些方法.
v2.4引入了own Array#min
和Array#max
,它比Enumerable的方法更快,因为它们跳过调用#each
.
编辑
@nicholasklick提到了另一种选择,Enumerable#minmax
但这次返回了一个数组[min, max]
.
[4, 5, 7, 10].minmax
=> [4, 10]
Run Code Online (Sandbox Code Playgroud)
在初始数组中只有2个值似乎不太有趣,所以
[5, 10].min
Run Code Online (Sandbox Code Playgroud)
Die*_*ias 51
您可以使用
[5,10].min
Run Code Online (Sandbox Code Playgroud)
要么
[4,7].max
Run Code Online (Sandbox Code Playgroud)
这是Arrays的一种方法.
Dav*_*rse 22
所有这些结果都会在热心尝试处理两个以上的争论时产生垃圾.我很想知道他们的表现与好的ol相比:
def max (a,b)
a>b ? a : b
end
Run Code Online (Sandbox Code Playgroud)
这是我对你的问题的官方回答.:)
Ham*_*fin 20
除了提供的答案之外,如果要将Enumerable#max转换为可以调用变量数或参数的max方法,就像在其他一些编程语言中一样,您可以编写:
def max(*values)
values.max
end
Run Code Online (Sandbox Code Playgroud)
输出:
max(7, 1234, 9, -78, 156)
=> 1234
Run Code Online (Sandbox Code Playgroud)
这会滥用splat运算符的属性来创建包含所有提供的参数的数组对象,或者如果没有提供参数则使用空数组对象.在后一种情况下,该方法将返回nil
,因为在空数组对象上调用Enumerable#max会返回nil
.
如果要在Math模块上定义此方法,这应该可以解决问题:
module Math
def self.max(*values)
values.max
end
end
Run Code Online (Sandbox Code Playgroud)
请注意,与三元运算符(?:
)相比,Enumerable.max至少慢两倍.有关更简单,更快捷的方法,请参阅Dave Morse的答案.
aar*_*ing 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]
Run Code Online (Sandbox Code Playgroud)