yield

– 処理を場合に応じて自由に変えられる。スマートになった Visitor パターンみたいなものかなぁ..
イテレーションを Iterator パターンなしでできる(内部で Iterator パターンを使って外には each メソッドを公開する等)。

class Iterator
  @values
  @nIndex
  
  def initialize(*values)
    @values = values.dup
    @nIndex = 0
  end
  
  def each
    yield(getNext) while hasNext
  end
  
  def hasNext
    return @nIndex < @values.size
  end
   
  private :hasNext
   
  def getNext
    throw RangeError.new(“no element for next”) if !hasNext
    
    res = @values[@nIndex]
    @nIndex += 1
    return res
  end
  
  private :getNext
end
 
iterator = Iterator.new(0,1,2,3,4)
iterator.each{ |i|
  print( i * 2, “, ” )
}
# result:
# 0, 2, 4, 6, 8,
#

この例はそのまま [0,1,2,3,4].each{|i| … } とした時の動作と同じだけど、マスターデータが膨大になりうる時などは自分で yield するメソッドを実装するとコスト削減になってよい。
 
参考:
<http://www.ruby-lang.org/ja/man/?cmd=view;name=%A5%E1%A5%BD%A5%C3%A5
%C9%B8%C6%A4%D3%BD%D0%A4%B7#yield
>