我目前正在阅读Agile Web Development With Rails,第3版。在页672,我遇到了这种方法:
def capitalize_words(string)
string.gsub(/\b\w/) { $&.upcase }
end
块中的代码是做什么的?我从未见过这种语法。它与array.map(&:some_method)
语法类似吗?
答案 0 :(得分:4)
这是标题套管输入。在街区内,$&是一个代表当前匹配的内置函数(\ b \ w,即每个单词的第一个字母),然后是大写的。
答案 1 :(得分:2)
gsub
将正则表达式中匹配的所有内容替换为块的结果。所以是的,在这种情况下,你匹配单词的第一个字母,然后用upxased版本替换它。
关于块中稍微奇怪的语法,这是等价的(也许更容易理解):
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
匹配单词的第一个字符。
答案 2 :(得分:2)
你已经谈到了我不喜欢Ruby的一些事情:)
魔术变量$&包含上一个成功模式匹配的匹配字符串。所以在这种情况下,它将是每个单词的第一个字符。
在String.gsub的RDoc中提到了这一点: