2010-09-16 64 views

回答

11

grep定义在Enumerable上,即它是一种对Hash es没有任何了解的通用方法。它适用于Enumerable的任何元素。 Ruby没有键值对的类型,它只是将Hash条目表示为两元素数组,其中第一个元素是键,第二个元素是该值。

grep使用===方法过滤元素。而且,由于没有

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

也不

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

是真实的,你总是得到一个空数组作为响应。

试试这个:

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

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

在这里你可以看到grep作品与Hash ES。

+0

谢谢,我看到===是为Object定义的,但没有为Hash重写,所以它没有意义。但至少我现在看到:{'a'=>'b'}。grep Array ... => [[“a”,“b”]] – user258980 2010-09-16 05:33:35

+3

@ user258980:事实上,'Hash#=== '没有被定义是完全不相关的,因为你没有调用'Hash#===',你正在调用'Hash#grep'。然后'Hash#grep'调用传递给它的任何对象的'==='方法。在你的例子中,该对象是'/ a /',所以'Hash#grep'最终调用'Regexp#==='依次传递每个元素。由于这些元素是两元素数组,并且'Regexp'显然永远不能匹配数组,只有字符串,结果将始终为空。 – 2010-09-16 11:39:40

+0

谢谢澄清。 – user258980 2010-09-16 18:37:16