【发布时间】:2010-07-07 18:16:40
【问题描述】:
我的第一个想法是这样的:
class AbstractBuilder
attr_reader :time_taken
def build_with_timer
started_at = Time.now
build
@time_taken = Time.now - started_at
end
def build
raise 'Implement this method in a subclass'
end
end
class MyBuilder < AbstractBuilder
def build
sleep(5)
end
end
builder = MyBuilder.new.build_with_timer
puts builder.time_taken
我怀疑有更好的方法可以提供更好的灵活性,例如,理想情况下,我想在 MyBuilder 实例上调用“build”而不是“build_with_timer”,并始终记录执行时间。
我确实考虑过在初始化时使用 alias_method,甚至使用模块 mixin 而不是类继承,这会覆盖在中间调用 super 的构建方法(不确定这是否可行)。在我进入兔子洞之前,我想我会看看是否有既定的做法。
【问题讨论】:
-
为了澄清我想在一个子类中定义一个已知名称的方法,该子类使用基类中定义的代码透明地包装(之前和之后)。与 ActiveRecord 过滤器相比,我需要更少的灵活性/开销。
标签: ruby metaprogramming