From: "akr (Akira Tanaka)" Date: 2013-10-02T11:46:40+09:00 Subject: [ruby-core:57577] [ruby-trunk - Feature #8840] Yielder#state Issue #8840 has been updated by akr (Akira Tanaka). marcandre (Marc-Andre Lafortune) wrote: > > The proposition of `with_state` is interesting, but I personally find it leads to complex/convoluted solutions and is cumbersome to use. Note that the given implementation of `drop2` is slightly incomplete as it needs to return a lazy enumerator, so `Enumerator.new` needs to be followed by a call to `lazy`. Would��you��explain��the��incompleteness��concretely? I��couldn't��understand. ---------------------------------------- Feature #8840: Yielder#state https://bugs.ruby-lang.org/issues/8840#change-42192 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/