您如何找到Ruby的最小/最大?

元气小坏坏 提交于 2020-02-27 18:28:33

我想做一些简单明了的事情,例如min(5,10)Math.max(4,7) 。 在Ruby中是否有实现此功能的函数?


#1楼

你可以做

[5, 10].min

要么

[4, 7].max

它们来自Enumerable模块 ,因此任何包含Enumerable东西都将具有这些方法。

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

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

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

#2楼

您可以使用

[5,10].min 

要么

[4,7].max

这是用于数组的方法。


#3楼

除了提供的答案之外,如果要将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的答案


#4楼

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

#5楼

所有这些结果都会产生垃圾,热心地尝试处理两个以上的参数。 我很想知道它们与好的'ol相比表现如何:

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

这是我对您问题的正式答复。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!