Chciałbym przetestować, czy klasa dziedziczy po innej klasie, ale wydaje się, że nie istnieje na to metoda.
class A
end
class B < A
end
B.is_a? A
=> false
B.superclass == A
=> true
Trywialna implementacja tego, czego chcę, to:
class Class
def is_subclass_of?(clazz)
return true if superclass == clazz
return false if self == Object
superclass.is_subclass_of?(clazz)
end
end
ale spodziewałbym się, że to już istnieje.
ruby
inheritance
subclass
superclass
Dezorientacja
źródło
źródło
A.class #=> Class
. DlategoB.is_a? A
zwraca false.kind_of?
kind_of?
sprawdza, czy obiekt jest instancją klasy. Nie, czy obiekt dziedziczy po klasie.kind_of?
jest aliasis_a?
Odpowiedzi:
Wystarczy użyć
<
operatoralub użyj
<=
operatoraźródło
is_a?
tłumaczy się na wystąpienie .B
nie jest instancjąA
,B.new
is is (B.new.is_a? A # => true
).Także dostępny:
Różni się to nieco od (krótszej) odpowiedzi,
B < A
ponieważB
jest zawarte wB.ancestors
:To, czy jest to pożądane, zależy od przypadku użycia.
źródło
B <= B
(taki sam wynik jakB.ancestors.include? B
).include?
i<
metody przechodzą przez łańcuch przodków . Robi to w C, więc na pewno szybciej niż zapętlanie tablicy Ruby ... ale praktycznie te dwa powinny być nierozróżnialne.B
. Ale tak jest. Dokumentacja metody mówi: „Zwraca listę modułów zawartych / dodanych do modów (w tym samego mod )”. (moje podkreślenie). Domyślam się, że zawiera własną klasę dla wygody użytkowania.include?
, ale to tylko spekulacje z mojej strony.