From: "marcandre (Marc-Andre Lafortune)" Date: 2013-09-01T04:39:50+09:00 Subject: [ruby-core:56948] [ruby-trunk - Feature #8840] Yielder#state Issue #8840 has been updated by marcandre (Marc-Andre Lafortune). judofyr (Magnus Holm) wrote: > Can't you just use the closure? Your example will fail if iterated a second time. It will also not work correctly when using `rewind` and `next`. Check #7696. ---------------------------------------- Feature #8840: Yielder#state https://bugs.ruby-lang.org/issues/8840#change-41507 Author: marcandre (Marc-Andre Lafortune) Status: Feedback Priority: Normal Assignee: matz (Yukihiro Matsumoto) Category: core Target version: current: 2.1.0 Defining an Enumerator that require a state is currently troublesome. For example, it is not really possible to define an equivalent of Lazy#drop in Ruby without making an assumption on the implementation. To address this, I propose that we (a) guarantee that a new Yielder object will be given for each enumeration (b) add a 'state' attribute to Yielder. This way, one could implement Lazy#drop in a way similar to: class Enumerator::Lazy < Enumerator def drop(n) n = n.to_i Lazy.new(self) do |yielder, *values| yielder.state ||= n if yielder.state > 0 yielder.state -= 1 else yielder.yield(*values) end end end end Note that (a) is currently true for Ruby MRI, JRuby and Rubinius, but it is not explicit in the documentation. -- http://bugs.ruby-lang.org/