通常,我会看到这样的东西:
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
答案 0 :(得分:1)
我认为这样的事情应该有效。
do_something_method将保存原始方法,然后通过在调用原始方法之前和之后打印时间戳来重新定义修改后的方法。
只是一个警告。确保在方法定义之后调用do_something_to,否则它将找不到原始方法并将失败。
class Class
def do_something_to(method)
class_eval <<-EOS, __FILE__, __LINE__ + 1
alias_method :modified_#{method}, :#{method}
def #{method}
puts Time.now.to_i
modified_#{method}
puts Time.now.to_i
end
EOS
end
end
class MyClass
def test_method
puts "Hello world"
end
do_something_to :test_method
end
MyClass.new.test_method
# => 1403105585
# => "Hello world!"
# => 1403105586