Integer#timesみたいなメソッド

先日、久しぶりに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}

お、できた。これはすっきり。