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