先日、久しぶりにRubyをいじったら何だか手間取ったので、リハビリ開始。
Integer#timesみたいなメソッドを書いてみようかと思ったのですが、驚いたことにループっぽい処理に対する拒否反応が!
OCamlの影響だろうか…
まぁ、再帰でいいじゃないかと。末尾最適されていない(んだよね?)のでスタックが溢れちゃうだろうけど。
class Integer def repeat &blk def loop i, &blk return if i >= self blk.call i loop i + 1, &blk end loop 0, &blk end end 7.repeat {|i| puts i}
う〜〜〜ん、ブロックの引き回しが嫌だなぁ。とはいえ、defで定義されたメソッドからはローカル変数(今回はblk)が見れなかった気がする。
あ、Procの再帰ってできるのかなぁ。
class Integer def repeat &blk loop = Proc.new do |i| return if i >= self blk.call i loop.call i + 1 end loop.call 0 end end 7.repeat {|i| puts i}
お、できた。これはすっきり。