From: "marcandre (Marc-Andre Lafortune)" Date: 2013-08-31T07:52:02+09:00 Subject: [ruby-core:56894] [ruby-trunk - Feature #8840][Open] Yielder#state Issue #8840 has been reported by marcandre (Marc-Andre Lafortune). ---------------------------------------- Feature #8840: Yielder#state https://bugs.ruby-lang.org/issues/8840 Author: marcandre (Marc-Andre Lafortune) Status: Open 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/