From: Tanaka Akira Date: 2009-08-19T13:07:56+09:00 Subject: [ruby-dev:39125] Re: StopIteration#result In article , Yukihiro Matsumoto writes: > Pythonからいただいて、sendというのはどうでしょう。Pythonでは > 値を渡すのと得るのが同じメソッドになっていますが、Rubyでは分 > 離するということで。ああ、でも send はRuby的には面倒な名前か > なあ。__send__があるとはいえ。 うぅむ。send という名前は重なっているので可能なら避けたいと ころです。 ためしに外部イテレータで内部イテレータを実現するのを書いてみ ると例えばこうなります。 def each_by_extiter(e) while true begin v = e.next rescue StopIteration return $!.result end yield_value = yield v # e.send v end end a = [1,2,3] e = a.each p each_by_extiter(e) {|x| p x } うぅむ。e.next が単値なのがよろしくありませんな。返り値にす るときにひとつの値にまとまって、情報が落ちています。 o = Object.new def o.each yield 1,2 end o.each {|*x| p x } #=> [1, 2] e = o.enum_for(:each) each_by_extiter(e) {|*x| p x } #=> [[1, 2]] というようにすると、違いがわかります。 まぁ、常に配列を返す Enumerator#{next_values,peek_values} の 追加ですかね。 -- [田中 哲][たなか あきら][Tanaka Akira]