yield
が今ひとつわからなくてぐぐっていたら、良記事を発見。
Ruby の yield って結局なんなの? - YNote
それでも yield
は複雑。再帰させるとむずかしい。例えば
class A def initialize @c = 1 end def each yield(@c) @c += 1 self.each {|x| print "-- #{x} "; yield(x)} end end a = A.new a.each {|i| print "\n#{i}\n"; break if i > 4}
というコードを自分で書いてみたが、結果が
1 -- 2 2 -- 3 -- 3 3 -- 4 -- 4 -- 4 4 -- 5 -- 5 -- 5 -- 5 5
となるのが自分でもよくわからない。yield はその時点での暗黙の proc オブジェクトを呼び出すので、上のようなコードだと、途中で暗黙の proc オブジェクトが変ってくるようだ。何だか不思議。