给出如下代码:
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 }
如何在保持p
的接收者的同时将呼叫从q
完全转发到q
?基本上我也希望打印3个,但是instance_exec
与所有红宝石方法一样,只能打印一个图块。是否可以不更改p
而使我可以互换使用p
和q
(这样的想法是使q
有时包裹p
)。>
答案 0 :(得分:4)
可以定义另一个单例方法:
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