2011-12-28 8 views
7

Umieściłem niektóre funkcje w module, które mają być rozszerzone przez obiekt. Chciałbym, aby funkcja była wykonywana automatycznie po rozszerzeniu modułu. Jednak musi on zostać wykonany w kontekście instancji, a nie modułu.Ruby: Moduł puszki automatycznie uruchamia kod inicjalizacyjny?

module X 
    extend self 

    @array = [1,2,3] 

end 
obj.extend(X) 

Obecnie @array nie jest tworzony w instancji. Nie chcę zmuszać programisty do wywoływania jakiejś metody inicjalizacji, ponieważ dla każdego Modułu musi on znać nazwę unikalnej metody wywoływania. Czy to możliwe ?

Odpowiedz

11

Można użyć Module#extended hak do kodu wykonawczego na rozbudowę i BasicObject#instance_exec (lub BasicObject#instance_eval) za wykonanie dowolnego kodu w kontekście rozszerzonej obiektu:

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

Dzięki zarówno Victor i avy. – rahul

4

Pokaż this artykuł

module Math 
    def self.extended(base) 
    # Initialize module. 
    end 
end 
Powiązane problemy