2011-12-28 15 views
7

Ho messo alcune funzionalità in un modulo, per essere esteso da un oggetto. Mi piacerebbe che la funzionalità fosse eseguita automaticamente quando il modulo è esteso. Tuttavia, deve essere eseguito nel contesto dell'istanza, non del modulo.ruby: il modulo può eseguire automaticamente il codice di inizializzazione?

module X 
    extend self 

    @array = [1,2,3] 

end 
obj.extend(X) 

Attualmente, @array non viene creato nell'istanza. Non desidero forzare lo sviluppatore a chiamare un metodo di inizializzazione, poiché da quel momento per ogni modulo è necessario conoscere il nome di un metodo univoco da chiamare. È possibile ?

risposta

11

È possibile utilizzare Module#extended gancio per il codice di esecuzione sull'estensione e BasicObject#instance_exec (o BasicObject#instance_eval) per eseguire codice arbitrario nel contesto di oggetto esteso:

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

grazie sia Victor e avy. – rahul

4

Mostra this articolo

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