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