2013-09-24 44 views
1

我在遺留代碼中發現以下內容:

"myString".sub(/^(.)/) {$1.upcase}看起來很奇怪。而在IRB執行,我得到了相同的結果"myString".capitalize

無法找到文件......就這麼結束了對SO

+0

您的標題和問題不匹配。你對'gsub'或'sub'感興趣嗎?他們不是一回事。 – meagar

回答

3

不完全是,

"myString".capitalize 
#=> "Mystring" 

"myString".sub(/^(.)/) {$1.upcase} 
#=> "MyString" 

docscapitalize

返回STR的副本與第一字符轉換爲大寫,其餘爲小寫。注意:大小寫轉換僅在ASCII區域有效。

1

sub接受可選塊,而不是替代參數。如果給定,它將子匹配放置到全局變量中,調用該塊,並返回字符串的匹配部分和塊的返回值。

正在討論的正則表達式在行的開頭找到第一個字符。它將該字符放置在$1中,因爲它包含在子匹配()中,調用該塊,該塊返回$1.upcase

順便說一下,這是一個大腦死亡的字符串大寫方法。即使您不知道.capitalize或此代碼是從之前.capitalize可用(?),您仍然可以簡單地完成myString[0] = myString[0].upcase。唯一可能的好處是.sub方法將在字符串爲空時起作用,其中""[0].upcase將引發異常。仍然,規避問題的更好方法是myString[0] = myString[0].upcase if myString.length > 0

0

兩者不完全相同。 sub用於替換指定模式的第一個匹配項,而gsub用於所有匹配項(即全局替換)。

在你的問題中,正則表達式是第一個字符,即$1並替換爲$1.upcase

CODE:

"myString".sub(/^(.)/) {$1.upcase} 

OUTPUT:

"MyString" 

CODE:

"myString".capitalize 

OUTPUT:

"Mystring"