2010-09-30 9 views
6

¿cuál es la mejor manera de hacer tal verificación profunda:rubí Hash incluir otro picadillo, Cheque profunda

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

gracias

+4

No está claro lo que realmente las que solicita el código para hacerlo. ¿Desea verificar si el hash tiene un valor que es un hash incluyendo la clave: c con valor 2 y clave: f con valor 3? ¿Desea verificar que el valor hash para la tecla b: es un hash que incluye la clave: c con el valor 2 y la clave: f con el valor 3? ¿O desea verificar que el valor hash para la tecla b es exactamente la clave hash: c con valor 2 y la clave: f con valor 3? Por favor explique exactamente lo que quiere, preferiblemente con algunos ejemplos que devuelvan verdadero, y algunos que devuelvan falso. – SamStephens

Respuesta

5

que creo que lo que quiere decir que a partir de un ejemplo (de alguna manera). Verificamos si cada clave en el subhash está en el superhash, y luego verificamos si los valores correspondientes de estas teclas coinciden de alguna manera: si los valores son hashes, realice otra comprobación profunda; de lo contrario, verifique si los valores son iguales:

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 

Se puede ver cómo funciona esto porque la declaración if devuelve un valor: la última declaración evaluado (yo no utilizar el operador condicional ternario porque eso haría que hasta aquí más feo y más difícil de leer).

+0

sí, gracias! ... –

0

I como éste:

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