2010-09-16 59 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