2011-12-28 52 views
7

我已经在模块中放置了一些功能,可以通过对象进行扩展。我希望功能在模块扩展时自动执行。但是,它必须在实例的上下文中执行,而不是模块。ruby​​:可以模块自动执行初始化代码吗?

module X 
    extend self 

    @array = [1,2,3] 

end 
obj.extend(X) 

目前,@array没有得到的实例创建的。我不希望强迫开发人员调用某种初始化方法,因为对于每个模块,他需要知道要调用的唯一方法的名称。这可能吗 ?

回答

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

由于两者维克多和阿维。 – rahul

4

显示this文章

module Math 
    def self.extended(base) 
    # Initialize module. 
    end 
end