## Feature #7612

### Enumerators take a proc

**Description**

If there is already a clean syntax for this, I apologize. I sure could not find it.

class Foo

def initialize

@inst = 18

end

def meth(a, b)

puts "method #{@inst} #{a} #{b}"

end

end

foo = Foo.new

e = %w{a b c}.each_with_index

p1 = Proc.new { |a, b| puts "proc #{a} #{b}" }

m2 = foo.method(:meth)

p2 = m2.to_proc

# Current Syntax possibilities¶

e.each { |a, b| puts "direct #{a} #{b}" }

e.each { |a, b| foo.meth(a, b) }

e.each { |a, b| p1.call(a,b) }

e.each { |a, b| m2.call(a,b) }

e.each { |a, b| p2.call(a,b) }

# Proposed Addition¶

e.each(p1) # same as e.each { |a, b| p1.call(a,b) }

e.each(m2) # same as e.each { |a, b| m2.call(a,b) }

e.each(p2) # same as e.each { |a, b| p2.call(a,b) }

# In the case of a method or lambda, the arguments are checked and possible errors thrown.¶

# In the case of a proc, the proc "tricks" apply¶

To add readability, an "apply_to" method could be added:

e.apply_to(p1)

The extra "each" bothers me since the enumerator already has an "each" associated with it.

### History

#### #1 [ruby-core:51100] Updated by Thomas Sawyer almost 4 years ago

=begin

Use `&`

:

e.each(&p1)

e.each(&m2)

e.each(&p2)

=end

#### #2 [ruby-core:51101] Updated by Marc-Andre Lafortune almost 4 years ago

**Status**changed from*Open*to*Rejected*

#### #3 [ruby-core:51103] Updated by Anonymous almost 4 years ago

Great! I tried something similar but I must have botched it somehow.

Oh.... I bet I tried e(&p1)

On Dec 23, 2012, at 1:15 PM, trans (Thomas Sawyer) wrote:

Issue #7612 has been updated by trans (Thomas Sawyer).

=begin

Use`&`

:e.each(&p1)

e.each(&m2)

e.each(&p2)

=end

Feature #7612: Enumerators take a proc

https://bugs.ruby-lang.org/issues/7612#change-35034Author: pedz (Perry Smith)

Status: Open

Priority: Normal

Assignee:

Category:

Target version:If there is already a clean syntax for this, I apologize. I sure could not find it.

class Foo

def initialize

@inst = 18

enddef meth(a, b)

puts "method #{@inst} #{a} #{b}"

end

endfoo = Foo.new

e = %w{a b c}.each_with_index

p1 = Proc.new { |a, b| puts "proc #{a} #{b}" }

m2 = foo.method(:meth)

p2 = m2.to_proc## Current Syntax possibilities¶

e.each { |a, b| puts "direct #{a} #{b}" }

e.each { |a, b| foo.meth(a, b) }

e.each { |a, b| p1.call(a,b) }

e.each { |a, b| m2.call(a,b) }

e.each { |a, b| p2.call(a,b) }## Proposed Addition¶

e.each(p1) # same as e.each { |a, b| p1.call(a,b) }

e.each(m2) # same as e.each { |a, b| m2.call(a,b) }

e.each(p2) # same as e.each { |a, b| p2.call(a,b) }## In the case of a method or lambda, the arguments are checked and possible errors thrown.¶

## In the case of a proc, the proc "tricks" apply¶

To add readability, an "apply_to" method could be added:

e.apply_to(p1)

The extra "each" bothers me since the enumerator already has an "each" associated with it.