你如何找到Ruby的最小/最大值?

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#minArray#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)

  • 标点符号不是问题.获取最大值的整个堆分配是这里的潜在丑陋. (17认同)
  • 或者你只需​​要http://www.ruby-doc.org/core-2.0/Enumerable.html#method-i-minmax (10认同)
  • Ruby主要面向程序员而不是计算机.用Matz的话来说"我希望看到Ruby帮助世界上每个程序员提高工作效率,享受编程,并且快乐.这是Ruby语言的主要目的." 这是来自Ruby上的维基百科页面. (6认同)
  • @kaz我不确定我理解你的评论. (3认同)
  • @Kaz ...你意识到`std :: max(4,7)`比'[4,7] .max`有更多的"标点符号"? (3认同)
  • @Doorknob你意识到`std :: max`可以导入到你的命名空间中,所以它只会变成`max(4,7)`.等待; 看着上面,我看到我已经说过了. (3认同)
  • @Kaz好的,那么相同数量的标点符号.无论如何,我的观点是"标点符号"不是任何有效的指标. (3认同)

Die*_*ias 51

您可以使用

[5,10].min 
Run Code Online (Sandbox Code Playgroud)

要么

[4,7].max
Run Code Online (Sandbox Code Playgroud)

这是Arrays的一种方法.

  • 从技术上讲,它是Enumerables的一种方法,而不是Arrays. (19认同)
  • 这是一种自 v2.4 以来性能优于 Enumerable 的数组方法 (3认同)

Dav*_*rse 22

所有这些结果都会在热心尝试处理两个以上的争论时产生垃圾.我很想知道他们的表现与好的ol相比:

def max (a,b)
  a>b ? a : b
end
Run Code Online (Sandbox Code Playgroud)

这是我对你的问题的官方回答.:)

  • 这是微优化,它们都非常快,差异可以忽略不计,请参阅基准测试:https://repl.it/@AndreFigueiredo/DearWeirdSweepsoftware (2认同)
  • 此分析是否考虑了在 GC 中花费的时间? (2认同)

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)