2010-07-06 10 views
7

Come riscrivere questa linea utilizzando un iteratore?Semplifica più is_a? chiama l'oggetto

actor.inspect if actor.is_a? Array || actor.is_a? Hash 

Il mio tentativo che doesnt lavoro:

actor.inspect if [Array, Hash].each { |c| actor.is_a? c } 

risposta

9

Se si desidera far corrispondere le classi esatte (e non discendenti), è possibile utilizzare:

[Hash, Array].member? a.class 

penso che si dovrebbe spiegare che cosa esattamente è necessario raggiungere. Forse l'unica cosa che devi controllare è se il tuo oggetto è un Enumerable o no, o anche se è un metodo particolare, lo respond_to?.

+0

+1 Avrei +2 se potessi per il consiglio di ducktyping aggiuntivo. – rampion

+0

Controlla che 'a.class == Hash' o' Array', ma fallirà per le sottoclassi di loro ... +1 per 'is_a? (Enumerable)' invece ... –

5

Siete alla ricerca di Array#any?

actor.inspect if [Array, Hash].any? { |c| actor.is_a? c } 

#each solito solo restituisce l'enumerabile. #any? insieme al risultato dei blocchi.

Problemi correlati