From: "mame (Yusuke Endoh)" Date: 2012-04-16T12:37:09+09:00 Subject: [ruby-core:44374] [ruby-trunk - Feature #6298][Rejected] Proc#+ Issue #6298 has been updated by mame (Yusuke Endoh). Status changed from Open to Rejected Hello, I think you have valid concern. AFAIK, there is no way to do this. But #5007 (Proc#call_under) is apparently a more general solution for this issue. You will be able to write BlockCollection with Proc#call_under: def to_proc Proc.new{ |*a| procs.each{ |p| p.call_under(self, *a) } } end So, let's discuss the feature in that thread. -- Yusuke Endoh ---------------------------------------- Feature #6298: Proc#+ https://bugs.ruby-lang.org/issues/6298#change-25920 Author: trans (Thomas Sawyer) Status: Rejected Priority: Normal Assignee: Category: core Target version: =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 #to_proc. It's not going to do the right thing if a BlockCollection instance is passed to #instance_eval 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 -- http://bugs.ruby-lang.org/