Ruby:转发接收者、参数和跨过程块

Ruby: forward receiver, arguments and block across procs

给出这样的代码:

p = proc do |*args, &block|
  p self
  p args
  p block[] if block
end

q = proc do |*args, &block|
  p 'before'
  instance_exec(*args, &p)
end

o = Object.new
o.define_singleton_method(:my_meth, q)
o.my_meth(1, 2) { 3 }

如何在保留 q 的接收者的同时将呼叫从 p 完全转发给 q?基本上我也想打印 3 个,但是 instance_exec 和所有 ruby 方法一样,只能占用一个块。是否可以在不更改 p 的情况下使用 pq 互换使用(想法是让 q 有时换行 p)。

可以定义另一个单例方法:

p = proc do |*args, &block|
  p self
  p args
  p block[] if block
end

q = proc do |*args, &block|
  p 'before'
  define_singleton_method(:pp, p)
  pp(*args, &block)
end

o = Object.new
o.define_singleton_method(:my_meth, q)
o.my_meth(1, 2) { 3 }

输出:

"before"
#<Object:0x007f5903c2de28>
[1, 2]
3
=> 3