gsub {$ 1.upcase}?相当于.capitalize?

时间:2013-09-24 02:38:27

标签: ruby-on-rails ruby legacy

我在遗留代码中发现了以下内容:

"myString".sub(/^(.)/) {$1.upcase}似乎很奇怪。在IRB中执行时,我得到与"myString".capitalize

相同的结果

无法找到文档......所以最终在SO

3 个答案:

答案 0 :(得分:3)

不完全是,

 "myString".capitalize
 #=> "Mystring"

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

来自capitalize的{​​{3}}

  

返回str的副本,第一个字符转换为大写,余数为小写。注意:大小写转换仅在ASCII区域有效。

答案 1 :(得分:1)

sub接受可选块而不是替换参数。如果给定,它将子匹配放入全局变量,调用块,并返回字符串的匹配部分和块的返回值。

有问题的正则表达式在行的开头找到第一个字符。它将该字符放在$1中,因为它包含在子匹配()中,调用该块,返回$1.upcase

顺便说一句,这是一种大脑死亡的方式来利用字符串。即使您不知道.capitalize或此代码来自 {/ 1}}之前的(?),您仍然可以完成.capitalize。唯一可能的好处是,如果字符串为空,myString[0] = myString[0].upcase方法将起作用,.sub将引发异常。尽管如此,绕过 问题的更好方法是""[0].upcase

答案 2 :(得分:0)

两者并不完全相同。 sub用于替换指定模式的第一个匹配项,而gsub用于替换所有匹配项(即全局替换)。

在您的问题中,正则表达式是第一个字符,即$1,并替换为$1.upcase

代码:

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

输出:

"MyString"

代码:

"myString".capitalize

输出:

"Mystring"