インデックス付きの無限ループ(Ruby)

Kernel#loop と同じですが、インデックスが付きます。意外と使うと思うのだが。Kernel#loop をオーバーライドしてもいいのだが、ここではやめておきました。

module Kernel
  def loop_with_index(i = 0)
    begin
      yield(i)
    end while (i += 1)
  end
end

実行例。無限ループなので、[Ctrl] + C で中断して下さい。

loop_with_index do |i|
  print "\e[1G#{i}  "
  sleep(0.5)
end


意外と使うので、サポートして欲しいような。まあ、普段は

i = 0
loop do
  puts i
  i += 1
end

とするか、

i = 0
begin
  puts i
end while (i += 1)

などとしている。下の方が見た目がいいかな。上の方がわかりやすいか。


※注記(2017/9/22)
すでに Enumerator#with_index が組み込みでサポートされています。

loop.with_index(10) do |_, i|
  puts i
end

こんな感じです。


※再追記(2018/11/24)
この方がよいかな?

1.step {|i| puts i}