経緯は id:terazzoさんのところでまとめてくださっています。
で、こちらのほぼタイトルだけをヒントにして、そうか、一連の処理を一方通行のモナド的にとらえるなら、Haskell でいうところの show を再定義してしまうことで、たとえば 15 fizz buzz value の最後の value とかいらないね、と。まあ、当初のもくろみ(関数みたく fizz buzz というメッセージを合成して送りたい!)からすれば、逃げ方を変えただけの負けは負けなんですけれども、案外、シンプルに書けてよさそうだったので、つい。^^;
Integer>>asFizzBuzzAssoc ^FizzBuzzAssoc key: self value: '' Integer>>fizz ^self asFizzBuzzAssoc fizz Integer>>buzz ^self asFizzBuzzAssoc buzz
Association subclass: #FizzBuzzAssoc FizzBuzzAssoc>>fizz (key isDivisibleBy: 3) ifTrue: [value := value, 'Fizz'] FizzBuzzAssoc>>buzz (key isDivisibleBy: 5) ifTrue: [value := value, 'Buzz'] FizzBuzzAssoc>>printOn: aStream (value ifEmpty: [key]) printOn: aStream
使用例
(1 to: 15) collect: [:n | n fizz buzz]
=> {1 . 2 . 'Fizz' . 4 . 'Buzz' . 'Fizz' . 7 . 8 . 'Fizz' . 'Buzz' . 11 . 'Fizz' . 13 . 14 . 'FizzBuzz'}
参考