2011-12-28 29 views
7

Tôi đã đặt một số chức năng trong một mô-đun, được mở rộng bởi một đối tượng. Tôi muốn các chức năng được thực hiện tự động khi module được mở rộng. Tuy nhiên, nó phải được thực hiện trong ngữ cảnh của cá thể, không phải là Module.ruby: mô-đun có thể thực thi mã khởi tạo tự động không?

module X 
    extend self 

    @array = [1,2,3] 

end 
obj.extend(X) 

Hiện tại, @array không được tạo trong cá thể. Tôi không muốn buộc các nhà phát triển để gọi một số phương pháp khởi tạo, kể từ đó cho mỗi Module ông cần phải biết tên của một phương pháp duy nhất để gọi. Điều này có thể không?

Trả lời

11

Bạn có thể sử dụng Module#extended móc cho mã thực hiện công tác khuyến nông và BasicObject#instance_exec (hoặc BasicObject#instance_eval) cho thực thi mã tùy ý trong bối cảnh của đối tượng mở rộng:

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

Nhờ cả Victor và avy. – rahul

4

Hiện this bài viết

module Math 
    def self.extended(base) 
    # Initialize module. 
    end 
end 
Các vấn đề liên quan