イテレータ (iterator)

イテレータの定義と使用。

Python

class Foo:
	def __init__(self):
        	self.data = [1, 2, 3]

	# ジェネレータ定義
	def generator(self):
		for v in self.data:
			yield v

# ジェネレータを内部イテレータ的に使用
for v in Foo().generator():
	print v

# ジェネレータをそのまま外部イテレータとして使用
it = iter(Foo().generator())
while True:
	try :
		print it.next()
	except StopIteration:
		break

余談だが、Python ではすべて外部イテレータとして実現されている模様。7 行のような配列の繰返しも、配列に外部イテレータが実装されていると思われる(__iter__, next メソッドが使える)。そのため 12 行実行中のコールスタックは、空となる。

メニューに戻る

Ruby

class Foo
	def initialize
		@data = [1, 2, 3]
	end

	# イテレータ定義
	def each
		@data.each { |v|
			yield v
		}
	end
end

# イテレータ使用
Foo.new.each { |v|
  puts v
}

内部イテレータを定義し、内部イテレータとして使用。

余談だが、Ruby ではすべて内部イテレータとして実現されている模様。8 行のような配列の繰返しも、配列に内部イテレータが実装されていると思われる。そのため 16 行実行中のコールスタックは、15 行の each コール → 8 行の each コール → 9 行の yield コール、となる。

メニューに戻る