我一直在研究Ruby Koans,并对“escape子句和单引号字符串”示例感到困惑。
一个例子表明我不能以这种方式真正使用转义字符,但紧接着,给出了以下示例:
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
这让我在两个方面感到困惑:
2
为assert_equal
时,为什么字符串大小为"\\\'"
? (我个人认为答案是"\'"
,这对于大小来说更有意义。)答案 0 :(得分:11)
您可以将string
分成两部分来澄清事情:
string = '\\' + '\''
每个部分都是长度为1的字符串; '\\'
是单个字符\
,'\''
是单个字符'
。当你把它们放在一起时,你得到两个字符串\'
。
在单个引用的字符串文字中有两个特殊字符:反斜杠和单引号本身。当然,单引号字符用于分隔字符串,因此您需要一些特殊的东西来将单引号转换为单引号字符串,特殊的是反斜杠,因此'\''
是单引号字符串文字,表示包含一个单引号字符的字符串。类似地,如果您需要在单个带引号的字符串文字中获得反斜杠,则使用另一个反斜杠将其转义,因此'\\'
的长度为1且包含一个反斜杠。
单引号字符在双引号字符串文字中没有特殊含义,因此您可以毫无困难地说{{1}}。但是,反斜杠在双引号字符串中确实有特殊含义,因此您必须说"'"
才能在双引号字符串中添加一个反斜杠。
考虑你的猜测"\\"
。单引号在双引号字符串中没有特殊含义,并且转义不需要转义的内容只会为您提供某些内容;因此,如果"\'"
是一个不需要在双引号字符串中转义的字符,那么c
将只是\c
。特别是,c
计算为"\'"
(即双引号字符串中的一个单引号)。
结果是:
"'"
'\\\'' == "\\'"
"\\\"" == '\\"'
"\'" == '\''
"\'" == "'"
'\\\''.length == 2
"\\\"".length == 2
"\'".length == 1
卡西姆给出的Wikibooks reference涵盖了这些事情。
当我需要将引号引入字符串时,我通常会切换到%q{}
(similar to single quoting) or %Q{}
(similar to double quoting),所有反斜杠都会让我的眼睛流血。
答案 1 :(得分:0)
这可能值得一读:http://en.wikibooks.org/wiki/Ruby_Programming/Strings
ruby-1.9.3-p0 :002 > a = '\\\''
=> "\\'"
ruby-1.9.3-p0 :003 > a.size
=> 2
ruby-1.9.3-p0 :004 > puts a
\'
在单引号中只有两个转义字符:\\
和\'
。