Forum: Ruby-core [ruby-trunk - Feature #7612][Open] Enumerators take a proc

Posted by Perry Smith (pedz)
on 2012-12-23 19:50
(Received via mailing list)
Issue #7612 has been reported by pedz (Perry Smith).

----------------------------------------
Feature #7612: Enumerators take a proc
https://bugs.ruby-lang.org/issues/7612

Author: 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
  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.
Posted by Thomas Sawyer (7rans)
on 2012-12-23 20:15
(Received via mailing list)
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-35034

Author: 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
  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.
Posted by marcandre (Marc-Andre Lafortune) (Guest)
on 2012-12-23 20:28
(Received via mailing list)
Issue #7612 has been updated by marcandre (Marc-Andre Lafortune).

Status changed from Open to Rejected


----------------------------------------
Feature #7612: Enumerators take a proc
https://bugs.ruby-lang.org/issues/7612#change-35035

Author: pedz (Perry Smith)
Status: Rejected
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
  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.
Posted by Perry Smith (pedzsan)
on 2012-12-23 20:40
(Received via mailing list)
Great!  I tried something similar but I must have botched it somehow.

Oh.... I bet I tried e(&p1)
Please log in before posting. Registration is free and takes only a minute.
Existing account (Switch to SSL-encrypted connection)
NEW: Do you have a Google/GoogleMail or Yahoo account? No registration required!
Log in with Google account | Log in with Yahoo account
No account? Register here.