– 処理を場合に応じて自由に変えられる。スマートになった 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>