如果我决定在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}"
还有其他选择吗?
答案 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%的可能性更安全。