Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/86.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在一些Ruby代码I';我发现_Ruby On Rails_Ruby - Fatal编程技术网

Ruby on rails 在一些Ruby代码I';我发现

Ruby on rails 在一些Ruby代码I';我发现,ruby-on-rails,ruby,Ruby On Rails,Ruby,我目前正在阅读Rails的敏捷Web开发,第3版。在第672页,我遇到了这种方法: def capitalize_words(string) string.gsub(/\b\w/) { $&.upcase } end 块中的代码在做什么?我从未见过这种语法。它是否类似于array.map(&:some\u方法)语法 它是输入的标题框。在块内,$&是一个内置项,表示当前匹配(\b\w即每个单词的第一个字母),然后将其大写。它是输入的标题。在块内,$&是一个内置项,表示当前匹配(\b\

我目前正在阅读Rails的敏捷Web开发,第3版。在第672页,我遇到了这种方法:

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

块中的代码在做什么?我从未见过这种语法。它是否类似于
array.map(&:some\u方法)
语法

它是输入的标题框。在块内,$&是一个内置项,表示当前匹配(\b\w即每个单词的第一个字母),然后将其大写。

它是输入的标题。在块内,$&是一个内置项,表示当前匹配(\b\w即每个单词的第一个字母),然后将其大写。

gsub
用块的结果替换正则表达式中匹配的所有内容。所以,是的,在这种情况下,你要匹配单词的第一个字母,然后用大写版本替换它

至于块内的稍微奇怪的语法,这是等效的(也许更容易理解):

或者更圆滑:

def capitalize_words(string)
  string.gsub /\b\w/, &:upcase
end

至于正则表达式(由鹤嘴锄手册提供),
\b
匹配单词边界,并且
\w
任何“单词字符”(字母数字和下划线)。因此
\b\w
匹配单词的第一个字符。

gsub
用块的结果替换正则表达式中匹配的所有内容。所以,是的,在这种情况下,你要匹配单词的第一个字母,然后用大写版本替换它

至于块内的稍微奇怪的语法,这是等效的(也许更容易理解):

或者更圆滑:

def capitalize_words(string)
  string.gsub /\b\w/, &:upcase
end

至于正则表达式(由鹤嘴锄手册提供),
\b
匹配单词边界,并且
\w
任何“单词字符”(字母数字和下划线)。所以
\b\w
匹配单词的第一个字符。

您已经提到了我不喜欢Ruby的几个方面之一:)

魔法变量$&包含上一次成功模式匹配的匹配字符串。在本例中,它将是每个单词的第一个字符

这在String.gsub的RDoc中提到:


你提到了我不喜欢Ruby的几件事之一:)

魔法变量$&包含上一次成功模式匹配的匹配字符串。在本例中,它将是每个单词的第一个字符

这在String.gsub的RDoc中提到:


正如我所说,我不喜欢Ruby的几件事之一。Wish Matz在Perl中留下了magic变量。Peter的答案(如下)显示了两个更可读的版本,它们都没有使用全局变量。(或者,更准确地说,该全局函数的任何使用都与
String#gsub
将变量传递到块的方式有关——它如何传递变量取决于Ruby实现。)正如我所说,Ruby有几点我不喜欢。Wish Matz在Perl中留下了magic变量。Peter的答案(如下)显示了两个更可读的版本,它们都没有使用全局变量。(或者更准确地说,该全局函数的任何使用都与
String#gsub
将变量传递到块的方式有关——如何传递变量取决于Ruby实现。)