2011-12-28 11 views
7

He puesto algunas funcionalidades en un módulo, para ser ampliado por un objeto. Me gustaría que la funcionalidad se ejecute automáticamente cuando se amplíe el módulo. Sin embargo, debe ejecutarse en el contexto de la instancia, no del Módulo.ruby: ¿el módulo puede ejecutar el código de inicialización automáticamente?

module X 
    extend self 

    @array = [1,2,3] 

end 
obj.extend(X) 

Actualmente, @array no se crea en la instancia. No deseo obligar al desarrollador a llamar a algún método de inicialización, ya que para cada Módulo necesita saber el nombre de un método único para llamar. Es posible ?

Respuesta

11

Puede utilizar Module#extended gancho para la ejecución de código de extensión y BasicObject#instance_exec (o BasicObject#instance_eval) para ejecutar código arbitrario en el contexto del objeto extendido:

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

gracias tanto a Victor y avy. – rahul

4

Mostrar this artículo

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