2010-09-30 11 views
6

qual è il modo migliore per rendere tale verifica profonda:rubino Hash includono un hash, Assegno profonda

{:a => 1, :b => {:c => 2, :f => 3, :d => 4}}.include?({:b => {:c => 2, :f => 3}}) #=> true 

grazie

+4

Non è chiaro che cosa realmente vogliono questo codice per fare. Vuoi controllare se l'hash ha un valore che è un hash chiave inclusa: c con valore 2 e chiave: f con valore 3? Volete verificare che il valore hash per la chiave b: è un hash che include la chiave: c con valore 2 e la chiave: f con valore 3? O vuoi controllare che il valore hash per la chiave b: sia _exactly la chiave hash: c con valore 2 e la chiave: f con valore 3? Per favore spiega esattamente cosa vuoi - preferibilmente con alcuni esempi che restituiscono true, e alcuni che restituiscono false. – SamStephens

risposta

5

mi sembra di vedere che cosa vuoi dire da che un esempio (in qualche modo). Controlliamo se ciascuna chiave nel subhash si trova nel superhash, quindi controlliamo se i valori corrispondenti di queste chiavi corrispondono in qualche modo: se i valori sono hash, esegui un altro controllo approfondito, altrimenti controlla se i valori sono uguali:

class Hash 
    def deep_include?(sub_hash) 
    sub_hash.keys.all? do |key| 
     self.has_key?(key) && if sub_hash[key].is_a?(Hash) 
     self[key].is_a?(Hash) && self[key].deep_include?(sub_hash[key]) 
     else 
     self[key] == sub_hash[key] 
     end 
    end 
    end 
end 

Si può vedere come questo funziona perché l'istruzione if restituisce un valore: l'ultima affermazione valutata (non ho usato l'operatore condizionale ternario, perché questo renderebbe a questo punto più brutto e difficile da leggere).

+0

sì, grazie! ... –

0

ho come questo:

class Hash 
    def include_hash?(other) 
    other.all? do |other_key_value| 
     any? { |own_key_value| own_key_value == other_key_value } 
    end 
    end 
end