如何在字符串中使用转义字符。

3

我一直在学习Ruby Koans,但是对于“转义字符和单引号字符串”的例子感到困惑。

其中一个例子展示了我不能以这种方式使用转义字符,但紧接着下面的例子却给出了:

def test_single_quotes_sometimes_interpret_escape_characters
  string = '\\\''
  assert_equal 2, string.size # <-- my answer is correct according to the program
  assert_equal "\\'", string  # <-- my answer is correct according to the program
end

这让我困惑了两个方面:

  1. 单引号有时可以与转义字符一起使用。
  2. assert_equal"\\\'"时,为什么字符串大小为2? (我个人认为答案应该是"\'",这在大小方面更有意义)。
2个回答

13
你可以将字符串分成两部分来澄清事情:
string = '\\' + '\''

每个部分都是长度为一的字符串;'\\' 是单个字符 \'\'' 是单个字符 '。当它们组合在一起时,你得到了两个字符的字符串 \'
在单引号字符串字面值中,有两个特殊字符:反斜杠和单引号本身。单引号字符用于限定字符串,因此需要一些特殊的东西将单引号放入单引号字符串中,这个“特殊的东西”就是反斜杠。因此,'\'' 是一个表示包含一个单引号字符的字符串的单引号字符串字面值。类似地,如果你需要将反斜杠放入单引号字符串字面值中,你需要用另一个反斜杠来转义它,因此 '\\' 长度为一,并包含一个反斜杠。
单引号字符在双引号字符串字面值中没有特殊含义,因此你可以说 "'" 而不会有任何困难。然而,反斜杠在双引号字符串中确实有特殊含义,因此你必须说 "\\" 才能将单个反斜杠放入双引号字符串中。
考虑你猜测的 "\'"。单引号在双引号字符串中没有特殊含义,转义不需要转义的内容只会让你得到你的“特殊的东西”;因此,如果 c 是双引号字符串中不需要转义的字符,则 \c 将只是 c。特别地,"\'" 计算结果为 "'"(即一个单引号在双引号字符串中)。

结果是:

  • '\\\'' == "\\'"
  • "\\\"" == '\\"'
  • "\'" == '\''
  • "\'" == "'"
  • '\\\''.length == 2
  • "\\\"".length == 2
  • "\'".length == 1
  • "'".length == 1

Kassym提供的Wikibooks reference涵盖了这些内容。

当我需要在字符串中加引号时,我通常会切换到%q{}(类似于单引号)或%Q{}(类似于双引号),所有反斜杠让我的眼睛难受。


这是一个很好的解释;感谢你们提供的链接。我也同意你的观点,我认为%q{}/%Q{}选项最适合引用,因为它更易于阅读。 - helipacter

0

第二个断言是正确的。在双引号内部不需要转义单引号(但仍需要转义反斜杠)。 - Mark Thomas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接