Как мне указать, что Rational должны отображаться в десятичной записи в Ruby? - PullRequest
1 голос
/ 31 марта 2011

Если я решу использовать Rationals в Ruby для консольного приложения, но не хочу, чтобы они отображались в виде дроби, есть ли идиоматический способ указать, что они должны отображаться в десятичной записи?

Опции, о которых я знаю, включают:

 fraction = Rational(1, 2)
 puts "Use to_f: #{fraction.to_f}"
 puts(sprintf("Use sprintf %f", fraction))
 class Rational
   def to_s
     to_f.to_s
   end
 end
 puts "Monkey patch Rational#to_s: #{fraction}"

Есть ли альтернативы?

1 Ответ

5 голосов
/ 01 апреля 2011

Вы можете использовать %g в sprintf, чтобы получить 'правильную' точность:

puts "%g" % Rational(1,2)
#=> 0.5

Я бы лично применил рациональное обезьяное исправление, как и вы, но тогда я фанат исправлений для обезьяны,Переопределение встроенного поведения to_s кажется вполне подходящим для консольного приложения.

Возможно, у вас есть другая альтернатива, где вы пишете свою собственную консоль, которая определяет Object#to_console для вызова to_s, а затем вы можете обезьянавместо этого патч в свой собственный Rational#to_console.Это дополнительное усилие сделало бы более безопасным с вероятностью 0,1%, что какая-то библиотека уже использует Rational#to_s таким образом, что это сломает ваш патч.

...