Project

General

Profile

Actions

Feature #5389

open

New method Enumerator#iterate

Added by yimutang (Joey Zhou) over 12 years ago. Updated about 6 years ago.

Status:
Assigned
Target version:
-
[ruby-core:39860]

Description

If we want to iterate over the elements of a enumerable object with multiple blocks, we can use the Enumerator class.

A method 'iterate' is required, we can write it in Ruby:

class Enumerator
  def iterate
    yield_value = self.next
    return_value = yield yield_value
    self.feed return_value
    self
  end
end

Well, here is an example:

array = (1..10).to_a
enum = array.map!

loop do
  enum.iterate {|n| n + 10 }
  enum.iterate {|n| n * 2 }
  enum.iterate {|n| -n }
end

p array # => [11, 4, -3, 14, 10, -6, 17, 16, -9, 20]

We want to map an array: the 1st element use blk1, the 2nd use blk2, the 3rd use blk3...

I think this Enumerator#iterate method is sometimes useful, so would you please introduce it into the language core?

Updated by naruse (Yui NARUSE) over 12 years ago

Enumerator#next is not enough?

Updated by yimutang (Joey Zhou) over 12 years ago

Yui NARUSE wrote:

Enumerator#next is not enough?

array = (1..10).to_a
enum = array.map!

loop do
enum.next {|n| n + 10 }
enum.next {|n| n * 2 }
enum.next {|n| -n }
end

p array # => [nil, nil, nil, nil, nil, nil, nil, nil, nil, nil]

#next needs no blocks. #iterate is a combination of #next and #feed, I think it's useful for External Iterators.

Updated by mame (Yusuke Endoh) almost 12 years ago

  • Status changed from Open to Assigned
  • Assignee set to matz (Yukihiro Matsumoto)
Actions #4

Updated by mame (Yusuke Endoh) over 11 years ago

  • Target version set to 2.6
Actions #5

Updated by naruse (Yui NARUSE) about 6 years ago

  • Target version deleted (2.6)
Actions

Also available in: Atom PDF

Like0
Like0Like0Like0Like0Like0