为什么索引为[0,1]的子字符串返回两个字符,包括转义反斜杠?

时间:2019-03-24 22:32:55

标签: ruby string escaping

我有:

long_string # => "\nIt was the best of times,\nIt was the worst of times.\n"

我得到:

long_string[0,1] # => "\n"

我很好奇为什么我会得到两个字符,而不是像其他情况那样仅仅得到"\"

这是在子字符串中以及子字符串之外如何处理转义字符吗?

3 个答案:

答案 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]将返回第一个字符。