1

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

"myString".sub(/^(.)/) {$1.upcase}看起来很奇怪。在 IRB 中执行时,我得到了相同的结果"myString".capitalize

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

4

3 回答 3

3

不完全是,

 "myString".capitalize
 #=> "Mystring"

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

文档capitalize

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

于 2013-09-24T02:48:32.747 回答
1

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

有问题的正则表达式在行首找到第一个字符。它将该字符放入其中,$1因为它包含在 sub-match 中(),调用块,该块返回$1.upcase

顺便说一句,这是一种将字符串大写的脑死方法。即使你不知道.capitalize或者这个代码是从以前 .capitalize可用的(?),你仍然可以简单地完成myString[0] = myString[0].upcase. 唯一可能的好处是,.sub如果字符串为空,该方法将起作用,其中""[0].upcase将引发异常。不过,绕过这个问题的更好方法是myString[0] = myString[0].upcase if myString.length > 0

于 2013-09-24T02:44:13.263 回答
0

两者并不完全相同。sub用于替换指定模式的第一次出现,而gsub对所有出现都进行替换(也就是说,它全局替换)。

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

代码 :

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

输出 :

"MyString"

代码 :

"myString".capitalize

输出 :

"Mystring"
于 2013-09-24T02:46:56.977 回答