在我找到的一些Ruby代码中帮助一些有趣的语法

时间:2010-01-25 04:56:11

标签: ruby-on-rails ruby

我目前正在阅读Agile Web Development With Rails,第3版。在页672,我遇到了这种方法:

def capitalize_words(string)
  string.gsub(/\b\w/) { $&.upcase }
end

块中的代码是做什么的?我从未见过这种语法。它与array.map(&:some_method)语法类似吗?

3 个答案:

答案 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中提到了这一点:

http://ruby-doc.org/core/classes/String.html#M000817