Вот еще один эффективный способ узнать, был ли модуль включен или расширен классом.
Как уже упоминалось, вы можете определить, включен ли модуль в класс, проверив метод класса included_modules
, который существует во всех классах в ruby.
Итак, если у вас есть класс с именем MyClass
, и вы хотите посмотреть, включает ли он модуль Comparable
, вы можете сделать что-то вроде этого:
# will return true if MyClass.include(Comparable)
MyClass.included_modules.include?(Comparable)
Если вы хотите определить, имеет ли ваш класс расширенный модуль ActiveRecord::Querying
, как это делают все классы моделей rails, вы можете использовать это:
# will return true if MyClass.extend(ActiveRecord::Querying)
MyClass.kind_of?(ActiveRecord::Querying)
Почему это работает? Цитирую книгу Красноречивый Рубин, Расс Олсен :
Когда вы смешиваете модуль в классе, Ruby немного переписывает иерархию классов, вставляя модуль как своего рода псевдо суперкласс класса.
Это также означает, что другой способ определить, был ли модуль включен в ваш класс, - сделать что-то подобное (хотя я все еще предпочитаю метод included_modules
):
# will also return true if MyClass.include(Comparable)
MyClass.new.kind_of?(Comparable)