FizzBuzzとの3か月(24)

お世話になっております。

今日は、RubyでFizzBuzzNumberの実装に挑戦してみました。
Ruby演算子のオーバーライドができますから、それほど苦労しないと思っていました。

Rubyには、数値型として、Numeric、Integerなどがあります。FizzBuzzNumberでは、整数しか使用しませんから、まずIntegerを継承したFizzBuzzNumberをつくり、initializeメソッドを実装しました。

class FizzBuzzNumber < Integer
  def initialize(value=0)
    super(value)
  end
end

しかし、このクラスのインスタンスを作ろうとすると、「undefined method `new'」となってしまいます。
Integerクラスには、Integer::induced_fromというクラスメソッドがあり、このメソッドをオーバーライドしてはどうかと考えました。
しかし、induced_fromメソッドでFizzBuzzNumberクラスのインスタンスを返すには、FizzBuzzNumber.newが使えないと実現できませんが、Integerクラスを継承している限り、実現は難しいようです。ここで、Integerクラスを継承するのはあきらめました。
次に、Integerクラスのスーパークラスである、Numericクラスを継承してみました。

class FizzBuzzNumber < Numeric
  def initialize(value=0)
    super(value)
  end
end

すると、今度は「in `initialize': wrong number of arguments (1 for 0) (ArgumentError)」となってしまいました。
この時点で、継承を使うことはあきらめました。
最終的なコードを、以下に記載します。

class FizzBuzzNumber
  def initialize(value=0)
    @value = value
  end

  def to_s()
    if @value % 3 == 0 && @value % 5 == 0 then
      return 'FizzBuzz'
    elsif @value % 3 == 0 then
      return 'Fizz'
    elsif @value % 5 == 0 then
      return 'Buzz'
    else
      return @value.to_s
    end
  end

  def +(other)
    return FizzBuzzNumber.new(@value + other)
  end
end

100.times {|i|
  puts(FizzBuzzNumber.new(i) + 1)
}

Pythonなら、+を実装しなくても普通の足し算の答えが返るのですが。

以上