Вы можете использовать %g
в sprintf, чтобы получить 'правильную' точность:
puts "%g" % Rational(1,2)
#=> 0.5
Я бы лично применил рациональное обезьяное исправление, как и вы, но тогда я фанат исправлений для обезьяны,Переопределение встроенного поведения to_s
кажется вполне подходящим для консольного приложения.
Возможно, у вас есть другая альтернатива, где вы пишете свою собственную консоль, которая определяет Object#to_console
для вызова to_s
, а затем вы можете обезьянавместо этого патч в свой собственный Rational#to_console
.Это дополнительное усилие сделало бы более безопасным с вероятностью 0,1%, что какая-то библиотека уже использует Rational#to_s
таким образом, что это сломает ваш патч.