2013-11-26 101 views
1

當我做:將塊變量傳遞給grep?

["bar","quax"].grep(/bar/) 

輸出是:

=> ["bar"] 

如果我做的:

["bar","quax"].grep(/fish/) 

輸出是:

=> [] 

我決定採取它更進一步r試圖通過一個塊到grep,但它不起作用。

["foo", "bar", "baz", "quax"].each do |some_word| 
    ["fish","jones"].grep(/some_word/) 
end 

輸出是:

=> ["foo", "bar", "baz", "quax"] 

我很好奇,爲什麼我的分機不能正常工作,因爲它似乎相當簡單。或者,這是否僅僅是違法行爲?

+0

那麼,呃..你在哪裏傳遞一個塊到grep? –

+0

塊變量我的意思是'some_word' – tawheed

回答

0

each正在迭代你的數組,但你沒有修改它。所以它只是循環幾次,調用grep,它實際上什麼都不做(從技術上講,它返回東西,你只是沒有做任何事情),然後返回原始數組。

你需要做一些使用grep的返回值 - 但它不是我清楚什麼應該是

另外,(我不明白爲什麼你正在使用each呢?)在這種情況下,some_word從字面上看就是「some_word」。你應該插入你的正則表達式,如.grep(/#{some_word}/)

+0

感謝您的澄清。我想我誤解了塊 – tawheed

0
["foo", "bar", "baz", "quax"].each do |some_word| 
    ["fish","jones"].grep(/some_word/) 
end 

是不正確的。 some_word爲參數來將擋,但/some_word/是一個正則表達式的字符串'some_word'匹配,無論是整個字符串或只是一個子串:

%w[some_word not_some_word_anymore].grep(/some_word/) 
# => ["some_word", "not_some_word_anymore"] 

如果你想使用的變量/參數some_word在正則表達式中,你必須以某種方式替換它。一個簡單的方法來做到這一點是:

/#{ some_word }/ 

或:

Regexp.new(some_word) 

例如:

foo = 'some_word' 
/#{ foo }/  # => /some_word/ 
Regexp.new(foo) # => /some_word/ 

原因:

["foo", "bar", "baz", "quax"].each do |some_word| 
end 

返回相同的陣列,是這就是each的行爲ES。我們通常不關心。如果你想變換數組,然後使用map

["foo", "bar", "baz", "quax"].map { |some_word| some_word.size } 
# => [3, 3, 3, 4] 

如果你想減少陣列中使用類似grepselectreject

["foo", "bar", "baz", "quax"].reject { |some_word| some_word['oo'] } 
# => ["bar", "baz", "quax"] 

["foo", "bar", "baz", "quax"].select { |some_word| some_word['oo'] } 
# => ["foo"]