优雅的ruby语法返回两个对象中较大的一个

doc*_*nge 29 ruby comparison

当然有一千种方法可以完成这项工作,但这是实现这一目标的最简单(或最优雅)的方法吗?

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

这实际上并不太破旧,但你会怎么做?

FMc*_*FMc 34

如果你不想生成一个数组,那就是条件运算符:

max = a > b ? a : b
Run Code Online (Sandbox Code Playgroud)


use*_*918 15

好的,我出于好奇测试了这个:

#!/usr/bin/env ruby
# -*- mode: ruby -*-

limit = 3000000

tstart_1 = Time.now()
(0..limit).each do |i; a,b, max|
  a = rand(9999999)
  b = rand(9999999)
  max = [a,b].max
end
puts "Array method: #{Time.now() - tstart_1} seconds"

tstart_2 = Time.now()
(0..limit).each do |i; a,b, max|
  a = rand(9999999)
  b = rand(9999999)
  max = (a > b) ? a : b
end

puts "Ternary method: #{Time.now() - tstart_2} seconds"
Run Code Online (Sandbox Code Playgroud)

输出:

数组方法:1.746134秒

三元法:1.002226秒


Tat*_*son 10

这就是为什么Enumerable#max已经为任何实现的类定义的原因Comparable.这绝对是最简单的.要真正了解正在发生的事情,您需要了解它是如何在您最喜欢的Ruby实现的核心库中实现的(并且它可能已经过优化).

  • 答案是说问题中的例子是正确的; 它不需要另一个例子. (3认同)