2012-09-26 14 views
6

Estoy tratando de comprender el comportamiento de la declaración include cuando se usa en Mixins múltiples. Es decir, tengo estas declaraciones:Comprender el comportamiento de la instrucción `include` para módulos mixin 'subsiguientes'

class Article < ActiveRecord::Base 
    include DoubleIncludedModule 
    include AModule 

    # ... 
end 

module AModule 
    include DoubleIncludedModule 

    # ... 
end 

module DoubleIncludedModule 
    # ... 
end 

¿Cuántas veces será el DoubleIncludedModule incluidos en la clase Article? Es decir, desde la inclusión "posterior" de DoubleIncludedModule (primero en la clase Article y luego en AModule incluida en la clase Article), el problema de "doble inclusión" será manejado automáticamente por Ruby o se incluirá el DoubleIncludedModule (erróneamente) ¿dos veces? Por supuesto, me gustaría incluir el módulo DoubleIncludedModulesolo una vez. ¿Cómo puedo hacer eso (tal vez usando algunos métodos de Ruby on Rails) de la manera correcta?

+3

El hecho de que esté utilizando Rails no significa que la pregunta tenga algo que ver con Rails. Rails no cambia la forma en que 'include' funciona en absoluto. Esto es puramente una pregunta de Ruby. –

+1

@Andrew Marshall - Podría ser que existan algunos métodos de Ruby on Rails que pueden ayudar a resolver algunos problemas como, por ejemplo, en la pregunta. – Backo

Respuesta

9

voy a responder con un ejemplo:

module M 
    def self.included base 
    puts "M included in #{base}" 
    end 
end 

module N 
    include M 

    def self.included base 
    puts "N included in #{base}" 
    end 
end 

class C 
    include M 
    include N 
end 

p C.ancestors 

impresiones

M included in N 
M included in C 
N included in C 
[C, N, M, Object, Kernel, BasicObject] 

Como podemos ver, M se incluye solamente una vez en C. Aunque técnicamente se incluyó dos veces desde que se incluyó en N que también se incluyó en C. ¿Esto importa? Probablemente no. Cada uno de ellos sigue apareciendo solo una vez en la cadena de ancestros, y cualquier método habría sido anulado con implementaciones equivalentes, es decir, esencialmente no operativas. A menos que esté haciendo algo exótico con el gancho included, es poco probable que note nada.

Cuestiones relacionadas