{'a' => 'b'}.grep /a/
=> []
>> {'a' => 'b'}.grep /b/
=> []
Il ne semble pas correspondre aux clés ou aux valeurs. Fait-il quelque chose que je ne discerne pas?Quelle est la signification de grep sur un Hash?
{'a' => 'b'}.grep /a/
=> []
>> {'a' => 'b'}.grep /b/
=> []
Il ne semble pas correspondre aux clés ou aux valeurs. Fait-il quelque chose que je ne discerne pas?Quelle est la signification de grep sur un Hash?
grep
est défini sur Enumerable
, c'est-à-dire qu'il s'agit d'une méthode générique qui ne connaît rien à propos de Hash
es. Il fonctionne sur tous les éléments du Enumerable
. Ruby n'a pas de type pour les paires clé-valeur, il représente simplement Hash
entrées comme des tableaux à deux éléments où le premier élément est la clé et le second élément est la valeur.
grep
utilise la méthode ===
pour filtrer les éléments. Et puisque ni
/a/ === ['a', 'b']
ni
/b/ === ['a', 'b']
sont vraies, vous obtenez toujours un tableau vide comme réponse.
Essayez ceci:
def (t = Object.new).===(other)
true
end
{'a' => 'b'}.grep t
# => [['a', 'b']]
Ici vous pouvez voir comment grep
fonctionne avec Hash
es.
Merci, je vois que === est défini pour Object, mais pas remplacé pour Hash, donc ce n'est pas vraiment significatif. Mais au moins je vois maintenant que: {'a' => 'b'}. Grep Array ... => [["a", "b"]] – user258980
@ user258980: Le fait que 'Hash # === 'n'est pas défini est complètement hors de propos, puisque vous n'appelez pas' Hash # === ', vous appelez' Hash # grep'. 'Hash # grep' appelle alors la méthode' === 'de l'objet qui y est passé. Dans votre exemple, cet objet est '/ a /', donc 'Hash # grep' finit par appeler' Regexp # === 'en passant chaque élément à son tour. Puisque ces éléments sont des tableaux à deux éléments, et qu'un 'Regexp 'ne peut évidemment jamais correspondre à un tableau, seulement des chaînes, le résultat sera toujours vide. –
Merci pour la clarification. – user258980