{'a' => 'b'}.grep /a/
=> []
>> {'a' => 'b'}.grep /b/
=> []
No parece coincidir con las claves o valores. ¿Hace algo que no estoy discerniendo?¿Cuál es el significado de grep en un Hash?
{'a' => 'b'}.grep /a/
=> []
>> {'a' => 'b'}.grep /b/
=> []
No parece coincidir con las claves o valores. ¿Hace algo que no estoy discerniendo?¿Cuál es el significado de grep en un Hash?
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.
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
@ 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. –
Gracias por aclarar. – user258980