Voici un autre moyen efficace pour voir si un module a été inclus ou prolongée par une classe.
Comme d'autres l'ont mentionné, vous pouvez déterminer si un module est inclus dans une classe en vérifiant la méthode de classe included_modules
qui existe sur toutes les classes de ruby.
Donc, si vous aviez une classe nommée MyClass
et que vous vouliez voir si elle inclus le module Comparable
que vous pourriez faire quelque chose comme ceci:
# will return true if MyClass.include(Comparable)
MyClass.included_modules.include?(Comparable)
Si vous voulez savoir si votre classe a étendu le module ActiveRecord::Querying
, comme toutes les classes de modèles de rails font, vous pouvez réellement utiliser:
# will return true if MyClass.extend(ActiveRecord::Querying)
MyClass.kind_of?(ActiveRecord::Querying)
Pourquoi cela fonctionne-t-il? Pour citer le livre Eloquent Ruby, by Russ Olsen:
Lorsque vous mélangez un module dans une classe, Ruby rebranche la hiérarchie des classes un peu, l'insertion du module comme une sorte de pseudo superclasse de la classe.
Cela signifie aussi qu'une autre façon de déterminer si un module a été inclus dans votre classe est de faire quelque chose comme ça (même si je préfère encore la méthode included_modules
):
# will also return true if MyClass.include(Comparable)
MyClass.new.kind_of?(Comparable)
Il existe une méthode prête pour cela, appelé 'included_modules '. – Swanand
Donc il y a. Merci pour le conseil. –
Il s'avère que j'ai sauté le pistolet. J'ai soulevé la question avec plus de détails. –