如何找到一个最小/最大与Ruby

我想使用min(5,10)Math.max(4,7)。Ruby中有这样的函数吗?

312051 次浏览

你可以这样做

[5, 10].min

[4, 7].max

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

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

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

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

你可以使用

[5,10].min

[4,7].max

它是数组的一个方法。

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

def max(*values)
values.max
end

输出:

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

这将滥用splat操作符的属性来创建一个包含所提供的所有参数的数组对象,如果没有提供参数,则创建一个空数组对象。在后一种情况下,该方法将返回nil,因为在空数组对象上调用可列举的#马克斯将返回nil

如果你想在Math模块上定义这个方法,这应该可以做到:

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

注意Enumerable。max至少是比三元运算符慢两倍(?:)。参见戴夫·莫尔斯的回答获得一个更简单和更快的方法。

如果你需要找到一个哈希的最大/最小值,你可以使用#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]

所有这些结果在热心地试图处理两个以上的实参时都会产生垃圾。我很好奇他们和优秀的人相比表现如何:

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

顺便说一句,这是我对你问题的正式回答。

def find_largest_num(nums)
nums.sort[-1]
end