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}