我应该如何指定Rational应该在Ruby中以十进制表示法显示?

时间:2011-03-31 01:58:40

标签: ruby view rational-number

如果我决定在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}"

还有其他选择吗?

1 个答案:

答案 0 :(得分:5)

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

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

我个人认为你有理性的补丁,但后来我是猴子补丁的粉丝。覆盖内置的to_s行为似乎完全适合控制台应用程序。

也许您还有另一种选择,您可以编写自己的控制台来定义Object#to_console来调用to_s,然后您可以在自己的Rational#to_console中修补补丁。额外的努力会使某些图书馆使用Rational#to_s已经以一种会破坏你的补丁的方式0.1%的可能性更安全。