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なら、+を実装しなくても普通の足し算の答えが返るのですが。
以上