1

如果我决定将 Ruby 中的 Rationals 用于控制台应用程序,但不希望它们显示为分数,是否有一种惯用的方式来指定它们应该以十进制表示法显示?

我知道的选项包括:

 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}"

有没有其他选择?

4

1 回答 1

5

您可以%g在 sprintf 中使用以获得“正确”的精度:

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

我个人会像您一样合理地进行猴子补丁,但是我是猴子补丁的粉丝。覆盖内置to_s行为似乎完全适合控制台应用程序。

也许您还有另一种选择,您可以编写自己的定义Object#to_console为 call的控制台,to_s然后您可以自己修改补丁Rational#to_console。这种额外的努力将使某些库Rational#to_s已经以一种会破坏您的补丁的方式使用的 0.1% 的可能性变得更安全。

于 2011-03-31T22:10:21.093 回答