我在模块中放了一些功能,由一个对象扩展。我想在扩展模块时自动执行功能。但是,它必须在实例的上下文中执行,而不是在Module。
module X
extend self
@array = [1,2,3]
end
obj.extend(X)
目前,@ array未在实例中创建。我不希望强制开发人员调用一些初始化方法,因为对于每个模块,他需要知道要调用的唯一方法的名称。这可能吗?
答案 0 :(得分:11)
您可以在扩展名和Module#extended(或BasicObject#instance_exec)上使用BasicObject#instance_eval挂钩执行代码,以便在扩展对象的上下文中执行任意代码:
module X
def self.extended(obj)
obj.instance_exec { @array = [1,2,3] }
end
end
class O
attr_reader :array
end
obj = O.new
obj.array # => nil
obj.extend(X)
obj.array # => [1, 2, 3]
答案 1 :(得分:4)
显示this文章
module Math
def self.extended(base)
# Initialize module.
end
end