我目前在閱讀第3版敏捷Web開發Rails。在頁672,我遇到了這種方法:在某些Ruby代碼中提供了一些有趣的語法幫助我找到了
def capitalize_words(string)
string.gsub(/\b\w/) { $&.upcase }
end
塊在做什麼代碼?我從來沒有見過這種語法。它與array.map(&:some_method)
語法相似嗎?
我目前在閱讀第3版敏捷Web開發Rails。在頁672,我遇到了這種方法:在某些Ruby代碼中提供了一些有趣的語法幫助我找到了
def capitalize_words(string)
string.gsub(/\b\w/) { $&.upcase }
end
塊在做什麼代碼?我從來沒有見過這種語法。它與array.map(&:some_method)
語法相似嗎?
它是標題框輸入。塊內部,$ &是內置的,代表當前匹配(\ b \ w,即每個單詞的第一個字母),然後大寫。
gsub
將正則表達式中匹配的所有內容替換爲塊的結果。所以是的,在這種情況下,你匹配的第一個字母的話,然後用upcased版本取代它。
作爲對塊內的微微離奇的語法,這相當於(也許更容易理解):
def capitalize_words(string)
string.gsub(/\b\w/) {|x| x.upcase}
end
甚至雨衣:
def capitalize_words(string)
string.gsub /\b\w/, &:upcase
end
爲正則表達式(禮貌鎬書),\b
匹配單詞邊界,\w
任何'單詞字符'(字母數字和下劃線)。所以\b\w
匹配單詞的第一個字符。
你談到的幾件事情我不喜歡Ruby的一個:)
&神奇的變量$包含從以前成功的模式匹配匹配的字符串。所以在這種情況下,它將成爲每個單詞的第一個字符。
這在RDoc的被提及String.gsub:
哦,親愛的。當我把Perl放在後面時,我認爲我逃脫了這種類型的語法...... – 2010-01-25 05:09:43
它只是可選的語法,並且不鼓勵... – Peter 2010-01-25 05:11:31
正如我所說的,我不喜歡Ruby的幾件事之一。 Wish Matz用Perl留下了魔術變量。 – 2010-01-25 05:30:33