【发布时间】:2014-06-18 15:34:00
【问题描述】:
我经常看到这样的东西:
class Someclass
do_something_to :foo, :bar, :class_level
def foo
puts "Hi!"
end
def bar
end
def self.class_level
puts "Something else!"
end
end
我想修补Class 或Object 以获得我自己的do_something_to 版本。不需要做任何花哨的事情,一个简单的打印输出当前时间与开始和结束的时间就可以了。
这是一个可行的解决方案,只是它不涉及类级别的方法:
require 'aspector'
class Class
def do_something_to(*names)
aspector do
around(names) do |proxy, *args, &block|
start_time = Time.now.to_f
proxy.call *args, &block
final_time = Time.now.to_f - start_time
puts final_time
return final_time
end
end
end
end
class MyClass
do_something_to :hey, :derp
def hey
puts "Hey!"
sleep 1
end
def derp x
puts x
sleep 2
end
end
【问题讨论】:
-
您是想将您的函数包装在所有方法周围(因此任何方法调用,无论它是什么,都会打印时间戳),还是仅一种特定方法(例如任何具有
test方法的类会在之前和之后打印时间戳)? -
@DaveMongoose 是的,我只想要指定的那些。我应该提到这一点
-
@waldyr,该参考很有用,但问题似乎略有不同,因为 dsp_099 希望包装器仅适用于特定方法。
-
dsp,之前我曾承诺提供另一种解决方案,但未能实现。我今晚会处理它,但如果您想选择答案,请不要等待。
标签: ruby class metaprogramming