Как я могу определить, наследует ли класс A от класса B, не создавая экземпляр объекта A в Ruby? - PullRequest
18 голосов
/ 06 марта 2011

Предположим, я хочу определить, наследуется ли Admin от ActiveRecord::Base.Один из способов сделать это - Admin.new.kind_of? ActiveRecord::Base, но он создает неиспользуемый объект Admin.

Есть ли простой способ сделать это без создания объекта Admin?

Спасибо

Ответы [ 4 ]

27 голосов
/ 06 марта 2011

Конечно, просто сравните два класса:

if Admin < ActiveRecord::Base
  # ...
end

Интересно отметить, что хотя Module#< вернет true, если Admin наследует от AR::Base, оно вернет false или nil, если это не так. false означает, что это наоборот, в то время как nil для не связанных классов (например, String < Range возвращает nil).

8 голосов
/ 06 марта 2011

Все довольно просто:

Admin < ActiveRecord::Base
=> true
4 голосов
/ 06 марта 2011
Admin.ancestors.include? ActiveRecord::Base

Хм. Ну, это работает, но мы только что узнали более хороший способ. Кажется, что Ruby's Module class определяет operator < для этой цели , а с class Class происходит от Module , , что означает, что < будет напрямую проверять производные классы.

3 голосов
/ 06 марта 2011
Admin.ancestors.includes? ActiveRecord::Base

Для прямого происхождения вы также можете использовать

Admin.superclass == ActiveRecord::Base
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...