Ruby: переслать приемник, аргументы и блок по всем процессам - PullRequest
0 голосов
/ 09 ноября 2018

Данный код выглядит так:

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, как и все методы ruby, может занимать только один блок. Возможно ли это без изменения p, чтобы я мог использовать p и q взаимозаменяемо (идея состоит в том, чтобы q иногда оборачивать p).

1 Ответ

0 голосов
/ 10 ноября 2018

Возможно определение другого одноэлементного метода:

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
...