2011-12-28 61 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