Feature #6298

Proc#+

Added by Thomas Sawyer about 2 years ago. Updated about 2 years ago.

[ruby-core:44366]
Status:Rejected
Priority:Normal
Assignee:-
Category:core
Target version:-

Description

=begin
Maybe there is another way to do this, and if so please enlighten me.

I have a case where collection of blocks need to be handled as if a single block, e.g.

class BlockCollection
def initialize(procs)
@procs = procs
end
def to_proc
procs = @procs
Proc.new{ |
a| procs.each{ |p| p.call(*a) } }
end
end

The issue with this is with #toproc. It's not going to do the right thing if a BlockCollection instance is passed to #instanceeval b/c it would not actually be evaluating each internal block via #instance_eval.

But if we change it to:

def to_proc
  Proc.new{ |*a| procs.each{ |p| instance_exec(*a, &p) } }
end

It would do the right thing with #instance_eval, but it would no longer do the right thing for #call, b/c would it evaluate in the context of BlockCollection instance instead of where the blocks weer defined.

So, unless there is some way to do this that I do not see, to handle this Ruby would have to provide some means for it. To this end Proc#+ is a possible candidate which could truly combine two procs into one.
=end


Related issues

Related to ruby-trunk - Feature #5007: Proc#call_under: Unifying instance_eval and instance_exec Assigned 07/09/2011

History

#1 Updated by Yusuke Endoh about 2 years ago

  • Status changed from Open to Rejected

Hello,

I think you have valid concern. AFAIK, there is no way to do this.
But #5007 (Proc#callunder) is apparently a more general solution
for this issue.
You will be able to write BlockCollection with Proc#call
under:

def toproc
Proc.new{ |*a| procs.each{ |p| p.call
under(self, *a) } }
end

So, let's discuss the feature in that thread.

Yusuke Endoh mame@tsg.ne.jp

Also available in: Atom PDF