2010-09-16 5 views

Répondre

11

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.

+0

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

+3

@ 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. –

+0

Merci pour la clarification. – user258980

Questions connexes