Подтвердить что ты не робот

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

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

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

Спасибо

4b9b3361

Ответ 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, это означает, что < будет непосредственно тестировать производные классы.