Aquí es otra manera eficaz de saber si un módulo ha sido incluido o extendieron por una clase.
Como han mencionado otros, puede determinar si un módulo está incluido en una clase al marcar el método de clase included_modules
que existe en todas las clases en ruby.
Así que si había una clase llamada MyClass
y que quería ver si incluido el módulo Comparable
se podría hacer algo como esto:
# will return true if MyClass.include(Comparable)
MyClass.included_modules.include?(Comparable)
Si desea determinar si su clase tiene extendieron el módulo ActiveRecord::Querying
, como todas las clases de rieles modelo hacen, en realidad se puede utilizar esto:
# will return true if MyClass.extend(ActiveRecord::Querying)
MyClass.kind_of?(ActiveRecord::Querying)
¿Por qué funciona esto? Para citar el libro Eloquent Ruby, by Russ Olsen:
Cuando se mezcla un módulo en una clase, Ruby rewires la jerarquía de clases un poco, insertando el módulo como una especie de seudo superclase de la clase.
Esto significa también que otra manera de determinar si un módulo ha sido incluido en su clase es hacer algo como esto (aunque yo prefiero el método included_modules
):
# will also return true if MyClass.include(Comparable)
MyClass.new.kind_of?(Comparable)
hay un método ya preparado para eso, llamados 'included_modules '. – Swanand
Así que hay. Gracias por el consejo. –
Resulta que salté el arma. He descargado la pregunta con más detalles. –