2010-08-15 13 views
17

¿Cómo enumeraría los módulos que se han incluido en una clase específica en una jerarquía de clases en Ruby? Algo como esto:¿Cómo se incluyen los módulos incluidos en una clase de Ruby?

module SomeModule 
end 

class ParentModel < Object 
    include SomeModule 
end 

class ChildModel < ParentModel 
end 

p ChildModel.included_modules #=> [SomeModule] 
p ChildModel.included_modules(false) #=> [] 

Listado de los ancestros hace que el módulo aparezca más arriba en el árbol:

p ChildModel.ancestors #=> [ChildModel, ParentModel, SomeModule, Object, Kernel] 

Respuesta

16

Por lo que yo entiendo su pregunta, algo parecido a esto es lo que busca:

class Class 
    def mixin_ancestors(include_ancestors=true) 
    ancestors.take_while {|a| include_ancestors || a != superclass }. 
    select {|ancestor| ancestor.instance_of?(Module) } 
    end 
end 

sin embargo, no entiendo plenamente sus casos de prueba: ¿por qué es SomeModule que aparece como un módulo incluido de ChildModel aunque no es realmente incluido en ChildModel pero en ParentModel? Y a la inversa, ¿por qué Kernelno está incluido en como un módulo incluido, a pesar de que se encuentra en la cadena de antepasados ​​como SomeModule? ¿Y qué significa el argumento booleano para el método?

(Tenga en cuenta que los argumentos booleanos son siempre mal diseño. Un método debe hacer exactamente una cosa Si se necesita un argumento booleano, lo hace por definición dos cosas, uno si el argumento es cierto, otro es el el argumento es falso. O si solo hace una cosa, esto solo puede significar que ignora su argumento, en cuyo caso no debería tomarlo para comenzar.)

+0

No soy el póster original, pero Creo que puedo responder a tu pregunta sobre el argumento booleano. Lance espera que este método '.included_modules' se comporte como' # methods', '# public_methods' y otros métodos similares en Ruby. En ellos, un valor "verdadero" significa "muéstreme los métodos que obtuvo este objeto de su clase ADEMÁS de los que obtuvo de sus clases ancestrales y módulos incluidos". Un valor falso no devuelve estos métodos adicionales. – pablobm

Cuestiones relacionadas