2010-12-28 12 views
145

Vorrei verificare se una classe eredita da un'altra classe, ma non sembra esistere un metodo per quello.Verificare se una classe Ruby è una sottoclasse di un'altra classe

class A 
end 

class B < A 
end 

B.is_a? A 
=> false 

B.superclass == A 
=> true 

Un banale realizzazione di ciò che voglio sarebbe:

class Class 
    def is_subclass_of?(clazz) 
    return true if superclass == clazz 
    return false if self == Object 
    superclass.is_subclass_of?(clazz) 
    end 
end 

ma mi aspetterei che questo esiste già.

+1

'A.class # => Classe'. Questo è il motivo per cui B.is_a? A' restituisce falso. – Wen

+0

cosa dire 'kind_of?' – akostadinov

+1

'kind_of?' Verifica se un oggetto è un _instance_ di una classe. Non se l'oggetto eredita da una classe. – Confusion

risposta

288

Basta usare il < operatore

B < A # => true 
A < A # => false 

o utilizzare l'<= operatore

B <= A # => true 
A <= A # => true 
+0

Ottimo suggerimento. Adoro Ruby ... –

+0

Questo funziona ... curioso se qualcuno sa perché "is_a?", No? Grazie! –

+13

@Brian Poiché "is_a?" Si traduce in * è l'istanza di *. 'B' non è un'istanza di' A', 'B.new' è però (' B.new.is_a? A # => true'). –

47

disponibili anche:

B.ancestors.include? A 

Questo differisce leggermente dal (più breve) risposta B < A perché B è inc luded in B.ancestors:

B.ancestors 
#=> [B, A, Object, Kernel, BasicObject] 

B < B 
#=> false 

B.ancestors.include? B 
#=> true 

Se questo è auspicabile dipende dal vostro caso d'uso.

+21

Più leggibile: 'B <= B' (stesso risultato di' B.ancestors.include? B'). Aggiornamento –

+0

: la soluzione immediatamente precedente funziona con 1.9+ mentre non ci sono "antenati?" in 1.9. – Barry

+0

@Barry Non vedo "antenati?" Menzionato in nessuna risposta in questa pagina, inclusa questa. A che cosa ti riferisci? – Phrogz

Problemi correlati