Ruby:在proc中转发接收器,参数和阻止

时间:2018-11-09 18:10:43

标签: ruby proc

给出如下代码:

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而使我可以互换使用pq(这样的想法是使q有时包裹p)。

1 个答案:

答案 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