Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 tr和gsub之间有什么区别?_Ruby - Fatal编程技术网

Ruby tr和gsub之间有什么区别?

Ruby tr和gsub之间有什么区别?,ruby,Ruby,我正在阅读Ruby文档,对gsub和tr之间的区别感到困惑。这两者之间有什么区别?tr返回str的副本,其中中的字符由中的相应字符替换为中的字符。如果to_str比from_str短,则用最后一个字符填充,以保持对应关系。 gsub返回str的副本,其中所有出现的模式都替换为第二个参数。模式通常是一个Regexp;如果以字符串形式给出,则它包含的任何正则表达式元字符都将按字面解释,例如,\d将匹配后跟d的齿隙,而不是数字。 tr只能将单个字符替换为单个固定字符(尽管您可以在单个tr调用中放置

我正在阅读Ruby文档,对
gsub
tr
之间的区别感到困惑。这两者之间有什么区别?

tr
返回
str
的副本,其中
中的字符由
中的相应字符替换为
中的字符。如果
to_str
from_str
短,则用最后一个字符填充,以保持对应关系。

gsub
返回
str
的副本,其中所有出现的模式都替换为第二个参数。模式通常是一个Regexp;如果以字符串形式给出,则它包含的任何正则表达式元字符都将按字面解释,例如,
\d
将匹配后跟
d
的齿隙,而不是数字。

  • tr
    只能将单个字符替换为单个固定字符(尽管您可以在单个
    tr
    调用中放置多个此类匹配项),但速度很快
  • gsub
    可以使用regex匹配复杂的模式,并替换为复杂的计算结果,但速度比
    tr
要替换(翻译)单个字符时使用

tr
匹配单个字符(不是通过正则表达式),因此字符不需要在第一个字符串参数中以相同的顺序出现。当找到一个字符时,它将替换为在第二个字符串参数的同一索引中找到的字符:

'abcde'.tr('bda', '123')
#=> "31c2e"

'abcde'.tr('bcd', '123')
#=> "a123e"
需要使用正则表达式或要替换较长的子字符串时使用:

'abcde'.gsub(/bda/, '123')
#=> "abcde"

'abcde'.gsub(/b.d/, '123')
#=> "a123e"

没错。当两者都工作时,
tr
gsub
快几倍。这里有一个基准测试,
tr
可以比
gsub
快多少。我发现这个问题是因为RuboCop提醒了我对gsub的使用——我认为下面的答案很好地解释了这个答案,这基本上就是gsub和tr之间的区别。上下文:名称
tr
的意思是“翻译”,就像在“翻译字符”中一样,这正是它所做的。它是以同名的Unix实用程序命名的(该实用程序以其晦涩和简短的名称而闻名)。