2017-09-22 35 views
0

當我這樣做,如何 '字符串#GSUB {}'(帶座)工作?

> "fooo".gsub("o") {puts "Found an 'o'"} 
Found an 'o' 
Found an 'o' 
Found an 'o' 
=> "f" 

gsub刪除所有'o'秒。這個怎麼用?

我覺得gsub通行證每一個字符來將擋,但由於塊無爲人物本身的(像抓住了它),它被丟棄。

我覺得這個情況是因爲,當我做

> "fooo".gsub("o"){|ch| ch.upcase} 
=> "fOOO" 

塊被捕捉的性格和把它變成大寫。 但是,當我這樣做,

> "fooo".gsub("o", "u"){|ch| ch.upcase} 
=> "fuuu" 

如何處理紅寶石在這種情況下,該塊?

我發現,使用Ruby的插頭yield塊進入的方法。 (檢查this),但我現在還不能確定我的第一個代碼示例和第三個例子說明。任何人都可以提供更多的信息嗎?

+0

'gsub'確實應該打印一個警告。 – Stefan

+0

@Stefan爲什麼應該這樣?任何方法都可以接受一個塊,如果每個方法都打印此警告? – engineersmnky

+0

@engineersmnky如果塊參數是方法的公共API的一部分,是的。就像'[]的.index(1){}'或'[] .fetch(1,0){}' – Stefan

回答

4

方法的文檔String#gsub解釋它是如何工作的,這取決於什麼參數它得到:

gsub(pattern, replacement)new_str
gsub(pattern, hash)new_str
gsub(pattern) {|match| block }new_str
gsub(pattern)enumerator

回覆匝數STR所有出現圖案的作爲第二個參數取代的副本。所述圖案通常是Regexp;如果作爲String給出,則其包含的任何正則表達式元字符將按字面解釋,例如, \\d將匹配的,而不是一個數字反斜線後跟d

如果替換String它將被替換爲匹配的文本。它可能包含窗體\\d,其中d是一組數字,或\\k<n>,其中n是一組的名稱模式的捕捉組反向引用。如果它是一個雙引號字符串,則兩個反引用前都必須加上一個額外的反斜槓。然而,更換內的特殊比賽變量,如$&,將不參考當前的匹配。

如果第二個參數是一個Hash,和匹配的文本是它的鍵中的一個時,相應的值是替換字符串。

在塊形式中,當前匹配字符串傳遞作爲參數,和變量如$1$2$`$&,並$'將被適當地設定。該塊返回的值將被替換爲每次調用的匹配。

結果繼承了原始字符串或任何提供替換字符串任何污點。

當既不是塊,也不是第二個參數被提供,一個Enumerator被返回。

的回答你的問題現在看起來簡單。 當只有一個參數被傳遞(在圖案「由塊返回的值將被替換爲匹配上的每個所說的」

兩個參數塊是文檔未涉及的情況,因爲它不是有效的組合。看起來,當兩個參數傳遞時,String#gsub不指望塊並忽略它。如果兩個,第二個參數和塊給出

+0

這回答我的問題。謝謝 !我已經通過文檔,但不知何故錯過了這條線。我會接受這個答案。 – retrazil

+0

該文檔沒有說第二個參數取代了該塊,是嗎? – Stefan

+0

@Stefan確實,文檔沒有提到任何關於兩個參數和一個塊的組合。我在答案中重寫了這一段。 – axiac

3

puts的返回值爲nil,該值由to_s轉換爲空白。因此,每個匹配"o"被替換爲空白。

+0

又如:' 「fooo」 .gsub( 「O」){[1,2,3] }#=> 「F [1,2,3] [1,2,3] [1,2,3]」',爲[陣列#to_s](http://ruby-doc.org/core-2.4 .0/Array.html#method-i-to_s)應用於塊中的數組。 –

+0

@sawa,所以在第一個例子中沒有字符傳遞給塊?第三個示例中忽略的塊? – retrazil

+0

@CarySwoveland謝謝!我對它的工作原理更感興趣。 sawa提供了很好的解釋,但它仍然不能完全回答我的問題。 – retrazil