Я хочу иметь возможность полностью прозрачно обернуть любой Ruby proc (включая те, которые я сам не написал для себя), и запишите его время выполнения.Оберните функцию Ruby
my_proc
То есть, я хочу создать процедурный, который вызывает my_proc
сохранение
- контексте/приемник
- аргументы
- блок.
и распечатать время выполнения, когда оно было вызвано.
Например:
my_proc = proc { |*args, &block| p self: self, args: args, block: block }
Object.new.instance_eval &my_proc
#=> {
# :self=>#<Object:0x007fd4c985f3e0>,
# :args=>[#<Object:0x007fd4c985f3e0>],
# :block=>nil
# }
Object.instance_exec '5', &my_proc
#=> {
# :self=>Object,
# :args=>["5"],
# :block=>nil
# }
my_proc.call(1, 2) { }
#=> {
# :self=>main,
# :args=>[1, 2],
# :block=>#<Proc:0x007fd4c985e9b8>
# }
И тогда я хочу, чтобы обернуть его, и он должен вести себя точно так же:
def wrap(prc)
# what does this look like?
end
wrapped_proc = wrap(my_proc)
Object.new.instance_eval(&wrapped_proc)
# took 1s
#=> {
# :self=>#<Object:0x007fd4c985f3e0>,
# :args=>[#<Object:0x007fd4c985f3e0>],
# :block=>nil
# }
Object.instance_exec '5', &wrapped_proc
# took 2s
#=> {
# :self=>Object,
# :args=>["5"],
# :block=>nil
# }
wrapped_proc.call(1, 2) { }
# took 3s
#=> {
# :self=>main,
# :args=>[1, 2],
# :block=>#<Proc:0x007fd4c985e9b8>
# }
Это не похоже, как у прозрачная функциональная оболочка должна быть сложной, но я не могу понять это.
Этот код для меня не работает. Вы имеете в виду 'p self, args, block' и' instance_eval (& wrapped_proc) '? И вы, вероятно, хотите использовать 'my_proc' вместо' wrapped_proc' в первом примере. – Stefan
Нет, я сдаюсь. это либо приемник, либо блок. Я не мог пройти все три. –
@ Серхио Туленцев, ты, должно быть, шутишь. Конечно, этот вопрос (все еще абсурдный) имеет ответ: 'def wrap (λ); λ; end'. – mudasobwa