From: shibata.hiroshi@... Date: 2014-01-30T06:17:13+00:00 Subject: [ruby-core:60309] [ruby-trunk - Feature #8840] Yielder#state Issue #8840 has been updated by Hiroshi SHIBATA. Target version changed from 2.1.0 to current: 2.2.0 ---------------------------------------- Feature #8840: Yielder#state https://bugs.ruby-lang.org/issues/8840#change-44796 * Author: Marc-Andre Lafortune * Status: Feedback * Priority: Normal * Assignee: Yukihiro Matsumoto * Category: core * Target version: current: 2.2.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. ---Files-------------------------------- state.pdf (87.8 KB) -- http://bugs.ruby-lang.org/