2010-09-16 13 views

Respuesta

11

grep se define en Enumerable, es decir, se trata de un método genérico que no sabe nada acerca de Hash es. Funciona independientemente de los elementos del Enumerable. Ruby no tiene un tipo para pares clave-valor, simplemente representa Hash entradas como matrices de dos elementos donde el primer elemento es la clave y el segundo elemento es el valor.

grep usa el método === para filtrar los elementos. Y ya que ni

/a/ === ['a', 'b'] 

ni

/b/ === ['a', 'b'] 

son verdaderas, siempre se obtiene una matriz vacía como respuesta.

Prueba esto:

def (t = Object.new).===(other) 
    true 
end 

{'a' => 'b'}.grep t 
# => [['a', 'b']] 

Aquí se puede ver cómo grep obras con Hash es.

+0

Gracias, veo que === se define para Object, pero no se reemplaza para Hash, por lo que no es realmente significativo. Pero al menos ahora veo que: {'a' => 'b'}. Grep Array ... => [["a", "b"]] – user258980

+3

@ user258980: El hecho de que 'Hash # === 'no está definido es completamente irrelevante, ya que no está llamando' Hash # === ', está llamando' Hash # grep'. 'Hash # grep' llama al método' === 'de cualquier objeto que se haya pasado a él. En su ejemplo, ese objeto es '/ a /', por lo que 'Hash # grep' termina llamando' Regexp # === 'pasando cada elemento por turno. Como esos elementos son matrices de dos elementos, y un 'Regexp' obviamente nunca puede hacer coincidir una matriz, solo cadenas, el resultado siempre estará vacío. –

+0

Gracias por aclarar. – user258980

Cuestiones relacionadas