Answers:
你可以做
[5, 10].min
要么
[4, 7].max
它们来自Enumerable模块,因此包括其中的任何东西都Enumerable
将具有可用的那些方法。
v2.4引入了own Array#min
和Array#max
,它们比Enumerable的方法快得多,因为它们跳过了调用#each
。
@nicholasklick提到了另一个选项,Enumerable#minmax
但是这次返回的数组[min, max]
。
[4, 5, 7, 10].minmax
=> [4, 10]
std::max(4, 7)
比“标点符号”还多[4, 7].max
吗?
std::max
可以将其导入到您的命名空间中,因此它变为max(4, 7)
。等待; 从上面看,我已经说过了。
您可以使用
[5,10].min
要么
[4,7].max
这是用于数组的方法。
所有这些结果都会产生垃圾,热心地尝试处理两个以上的参数。我很想知道它们与好的'ol相比表现如何:
def max (a,b)
a>b ? a : b
end
这是我对您问题的正式答复。
[a,b].max
,但是还不清楚它是否比上述实现更快。 blog.bigbinary.com/2016/11/17/…–
除了提供的答案之外,如果要将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至少慢两倍。有关更简单,更快速的方法,请参见Dave Morse的答案。
def find_largest_num(nums)
nums.sort[-1]
end