@m_seki の

I like ruby tooから引っ越し

IntegerもRubyオブジェクト

id:sumimさんの数値のFizz、Buzz等への変換を、Smalltalk(とRuby)で通常より直感的に表現したい - Smalltalkのtは小文字ですをなんか見つけたのでRubyで真似してみましたー。

class Integer
  def method_missing(sym, *args)
    sel = sym.to_s
    m = self
    return super unless sel=~/^[A-Z]/ and args.size.zero?
    Integer.class_eval{
      define_method(sel.downcase){@sumim = @sumim.to_s + sel if self%m==0; self}
    }
  end

  def inspect
    @sumim ? @sumim.inspect : self.to_s
  end
end

3.Pizz; 5.Quzz; 7.Razz
p (1..3*5*7).collect {|n| n.pizz.quzz.razz}

Integerの定義を書き換えてメソッド追加していたので、気持ちよくIntegerにインスタンス変数を持っていただきました。inspectを書き換えるかto_strを書き換えるかは気分しだい。

あ。ということで、Smalltalkでは、FizzBuzzを書くのにモナド的な視点で逃げをうってみた - Smalltalkのtは小文字ですの記事もあったので書き直しました。

class Integer
  def fizz
    @sumim = @sumim.to_s + 'Fizz' if self % 3 == 0
    self
  end

  def buzz
    @sumim = @sumim.to_s + 'Buzz' if self % 5 == 0
    self
  end

  def inspect
    @sumim ? @sumim.inspect : self.to_s
  end
end

p (1..15).collect {|n| n.fizz.buzz}