将字符串文字中的状态转义为`String#tr`的参数

关于在单引号字符串文字中反斜杠的转义状态作为String#tr参数,我有些神秘感。 你能解释下面三个例子之间的对比吗? 我特别不理解第二个。 为了避免复杂化,我在这里使用'd' ,这不会改变双引号转义时的含义( "\d" = "d" )。

 '\\'.tr('\\', 'x') #=> "x" '\\'.tr('\\d', 'x') #=> "\\" '\\'.tr('\\\d', 'x') #=> "x" 

逃离tr

tr的第一个参数与正则表达式中的括号字符分组非常相似。 您可以在表达式的开头使用^来否定匹配(替换不匹配的任何内容)并使用例如af来匹配一系列字符。 由于它具有控制字符,因此它也可以在内部进行转义,因此您可以使用-^作为文字字符。

 print 'abcdef'.tr('b-e', 'x') # axxxxf print 'abcdef'.tr('b\-e', 'x') # axcdxf 

在Ruby单引号字符串中转义

此外,当使用单引号时,Ruby会尽可能包含反斜杠,即当它不用于实际转义另一个反斜杠或单引号时。

 # Single quotes print '\\' # \ print '\d' # \d print '\\d' # \d print '\\\d' # \\d # Double quotes print "\\" # \ print "\d" # d print "\\d" # \d print "\\\d" # \d 

重新讨论了这些例子

考虑到所有这些,让我们再看看这些例子。

 '\\'.tr('\\', 'x') #=> "x" 

定义为'\\'的字符串成为文字字符串\因为第一个反斜杠会转义第二个。 没有惊喜。

 '\\'.tr('\\d', 'x') #=> "\\" 

定义为'\\d'的字符串成为文字字符串\dtr引擎又使用文字字符串中的反斜杠来转义d 。 结果: tr用x替换d实例。

 '\\'.tr('\\\d', 'x') #=> "x" 

定义为'\\\d'的字符串成为文字\\d 。 首先\\成为\ 。 然后\d变为\d ,即保留反斜杠。 (这种特殊行为不同于双字符串,其中反斜杠将被活着吃掉,只留下一个寂寞的d

字符串\\d然后使tr替换所有字符,这些字符是反斜杠或带有替换字符串的d