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
的情况下使用 p
和 q
互换使用(想法是让 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
给出这样的代码:
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
的情况下使用 p
和 q
互换使用(想法是让 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