如何制作Ruby 2.2 Rational#to_s在分母为1时仅显示分子

时间:2015-07-24 02:31:58

标签: ruby

早期版本的Ruby puts Rational(5)曾用于生成5作为输出。使用Ruby 2.x它总是显示分母,即使它是1.它有没有办法修补Rational类以恢复旧的行为?我知道我可以编写一个新功能,如

class Rational
  def esthetic_to_s
    denominator == 1 ? numerator.to_s : to_s
  end
end

获得理想的行为

puts 5r.esthetic_to_s       # => 5
puts 1.5r.esthetic_to_s     # => 3/2

但我仍然必须明确地调用它。我宁愿能够说出

puts 5r        # => 5
puts 1.5r      # => 3/2

并按指示工作。

2 个答案:

答案 0 :(得分:2)

您可以使用Rational#to_s

直接修改alias
class Rational
  alias old_to_s to_s
  def to_s
    denominator == 1 ? numerator.to_s : old_to_s
  end
end

答案 1 :(得分:1)

您可以优化Rational#to_s以执行您想要的操作,而不会全局影响其行为:

module RationalRefinement
  module PrettyToS
    def to_s
      if denominator == 1 then numerator.to_s else super end
    end
  end

  refine Rational do
    prepend PrettyToS
  end
end

1.to_r.to_s
# => '1/1'

using RationalRefinement

1.to_r.to_s
# => '1'

module RefinementsAreLexicallyScopedNotGlobal
  puts 1.to_r
  # 1/1
end