Ruby のブロック付きメソッド

Ruby ではブロック付きメソッドを使って、繰り返し操作を自分のためにカスタマイズすることができます。繰り返しのためのブロック付きメソッドは、「イテレータ」と呼ばれます。例えば下のイテレータは、配列に対する each_with_index メソッドのような働きをしますが、配列の中身が入る第一引数はありません。str は繰り返す配列で、|i| には繰り返している番号が入ります。

class Array
  def eachnum
    for j in 0..(self.length - 1)
      yield(j)
    end
  end
end

str = %w(a i u e o)
str.eachnum do |i|
  puts str[i]
end

順番に「a i u e o」が出力されます。ここから、each メソッドに等価なイテレータを作ることもできます。上の yield(j) のところを、yield(self[j]) に替えるだけです。