From: "matz (Yukihiro Matsumoto)" Date: 2013-08-31T13:54:56+09:00 Subject: [ruby-core:56910] [ruby-trunk - Feature #8840][Feedback] Yielder#state Issue #8840 has been updated by matz (Yukihiro Matsumoto). Status changed from Open to Feedback I understand the motivation, and how it works. It is very simple. But I hesitate to introduce state easily in this age of functional programming. Let me think for a while. And tell me if anyone has better idea to address the issue. Matz. ---------------------------------------- Feature #8840: Yielder#state https://bugs.ruby-lang.org/issues/8840#change-41461 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/