From: Tanaka Akira Date: 2009-08-20T01:55:57+09:00 Subject: [ruby-dev:39137] Re: StopIteration#result In article , Yukihiro Matsumoto writes: > PEP432には feed という名前の提案があったと書いてあります。 > feedというのは悪くないかもしれませんね。特に今回の案では、与 > える(feed)だけで返り値はnextで受けるわけですから。 feed はいいですね。そうしてみました。 というわけで、 def ext_each(e) while true begin vs = e.next_values rescue StopIteration return $!.result end y = yield *vs e.feed y end end というように外部イテレータを使って内部イテレータを実装して、 yield の値やイテレータの値を同じにすることができるようになり ました。 o = Object.new def o.each p yield p yield 1 p yield(1, 2) 3 end p o.each {|*x| p x; [:b, *x] } #=> [], [:b], [1], [:b, 1], [1, 2], [:b, 1, 2], 3 p ext_each(o.to_enum) {|*x| p x; [:b, *x] } #=> [], [:b], [1], [:b, 1], [1, 2], [:b, 1, 2], 3 -- [田中 哲][たなか あきら][Tanaka Akira]