Элегантный рубиновый синтаксис для возврата большего из двух объектов - PullRequest
28 голосов
/ 13 марта 2010

Конечно, есть тысячи способов сделать это, но самый простой (или самый элегантный) способ достичь этого?

[4,8].max

Это на самом деле не так уж и плохо, но что бы вы сделали?

Ответы [ 3 ]

34 голосов
/ 13 марта 2010

Если вы не хотите порождать массив, есть условный оператор:

max = a > b ? a : b
15 голосов
/ 06 ноября 2015

Хорошо, я проверил это из любопытства:

#!/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"

Выход:

Метод массива: 1.746134 секунд

Тройной метод: 1,002226 секунд

10 голосов
/ 13 марта 2010

Именно поэтому Enumerable#max был определен для любого класса, который реализует Comparable.Это определенно самое простое.Чтобы действительно понять, что происходит, вам нужно посмотреть, как это реализовано в базовой библиотеке вашей любимой реализации Ruby (и, вероятно, оптимизировано).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...