我有:
long_string # => "\nIt was the best of times,\nIt was the worst of times.\n"
我得到:
long_string[0,1] # => "\n"
我很好奇为什么我会得到两个字符,而不是像其他情况那样仅仅得到"\"
。
这是在子字符串中以及子字符串之外如何处理转义字符吗?
答案 0 :(得分:1)
摘自String#[]
的文档
str[start, length] → new_str or nil
如果传递了
start
索引和length
,则返回从length
索引开始的包含start
个字符的子字符串
例如
"Hello"[0, 1] #=> "H"
'Hello'[0, 1] #=> "H"
但是单引号和双引号之间是有区别的。
双引号允许许多转义序列,例如"\n"
,"\t"
,"\s"
,"\r"
等。这不是两个字符,而是一个字符。
"\n"
只是一个(换行符)字符。但是'\n'
包含两个字符(反斜杠和字母)。
"\n".size #=> 1
'\n'.size #=> 2
当您尝试从零索引开始返回一个字符时,比较双引号和单引号的不同行为
"\n"[0, 1] #=> "\n"
'\n'[0, 1] #=> "\\"
从以上"\\"
可以明显看出,这只是一个字符(反斜杠)。另一个反斜杠用于转义。
答案 1 :(得分:0)
已解决-上面的灵活引号将字符串存储为"\nIt was the best of times,\nIt was the worst of times.\n"
(双引号)。双引号字符串解释转义字符,而单引号字符串则不能。
例如
string = "\n"
string.size == 1以上
string.size == 2 in below
string = '\n'
答案 2 :(得分:-6)
[0,1]将始终返回2个字符-字符0和字符1。[0,0]将返回第一个字符。