Как я могу определить, наследует ли класс A от класса B без создания экземпляра объекта A в Ruby?
Предположим, что я хочу определить, наследует ли Admin
от ActiveRecord::Base
. Один из способов сделать это - Admin.new.kind_of? ActiveRecord::Base
, но это создает неиспользуемый объект Admin
.
Есть ли простой способ сделать это без создания объекта Admin
?
Спасибо
Ответы
Ответ 1
Конечно, просто сравните два класса:
if Admin < ActiveRecord::Base
# ...
end
Интересно отметить, что пока Module#<
вернет true
, если Admin
наследует от AR::Base
, он вернется false
или nil
, если это не так. false
означает, что это наоборот, а nil
- для несвязанных классов (например, String < Range
возвращает nil
).
Ответ 2
Это довольно просто:
Admin < ActiveRecord::Base
=> true
Ответ 3
Admin.ancestors.includes? ActiveRecord::Base
Для прямой родословной вы также можете использовать
Admin.superclass == ActiveRecord::Base
Ответ 4
Admin.ancestors.include? ActiveRecord::Base
Хм. Ну, это работает, но мы только что научились лучше. Кажется, что класс Ruby Module определяет оператор <
для этой цели, и поскольку класс Class происходит от Module, это означает, что <
будет непосредственно тестировать производные классы.