Issue #8840 has been updated by knu (Akinori MUSHA).

Status changed from Feedback to Rejected

I guess the API is not good enough if you have to do `yielder.state ||= กฤ`, and it looks like akr's suggestion works.

Since there has been no feedback, I'm closing this.

----------------------------------------
Feature #8840: Yielder#state
https://bugs.ruby-lang.org/issues/8840#change-67499

* Author: marcandre (Marc-Andre Lafortune)
* Status: Rejected
* Priority: Normal
* Assignee: matz (Yukihiro Matsumoto)
* Target version: 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)


-- 
https://bugs.ruby-lang.org/

Unsubscribe: <mailto:ruby-core-request / ruby-lang.org?subject=unsubscribe>
<http://lists.ruby-lang.org/cgi-bin/mailman/options/ruby-core>