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

And*_*imm 1 ruby rational-number view

如果我决定在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}"
Run Code Online (Sandbox Code Playgroud)

还有其他选择吗?

Phr*_*ogz 5

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

puts "%g" % Rational(1,2)
#=> 0.5
Run Code Online (Sandbox Code Playgroud)

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

也许你有另一个选择,你可以编写自己的控制台来定义Object#to_console调用to_s,然后你可以自己修改补丁Rational#to_console.额外的努力会使某些库Rational#to_s已经以一种会破坏你的补丁的方式使用0.1%的几率更安全.