2.0.0p247 :069 > str[str.length].class
=> NilClass
2.0.0p247 :071 > str[str.length, 1].class
=> String
2.0.0p247 :072 > str[str.length, 2].class
=> String
2.0.0p247 :073 > str[str.length+ 1, 2].class
=> NilClass
第一行返回NilClass
,第二行返回String
。 Ruby方法String#[n]
返回单字符字符串,String#[m, n]
返回字符串中的子字符串。这是否意味着单字符串与子字符串不同?
答案 0 :(得分:3)
这是否意味着单字符串与子字符串不同?
没有。这意味着String#[]
的行为会有所不同,具体取决于传递给它的参数。
您正尝试访问字符串的最后一个字符。
str[str.length]
返回nil
,因为那里没有字符。
如果初始索引超出字符串或长度为负,则返回
nil
。
str[-1]
返回最后一个字符,然后......
str[-1].class
返回String
。
...类似地
str[str.length, 1]
返回空字符串""
。
再次,the documentation陈述(强调我的):
如果传递了
start
索引和length
,则会返回一个子字符串,其中包含从索引开始的length
个字符。
由于str
的末尾没有更多字符,因此该子字符串为空。
答案 1 :(得分:2)
请遵循以下代码:
s = "abc"
s[s.size] # => nil
s[s.size,1] # => ""
s.size # => 3
String#[]
的文档:
元素引用 - (a)如果传递一个索引,则返回该索引处一个字符的子字符串。(b)如果传递了一个起始索引和一个长度,则返回一个包含从索引开始的长度字符的子字符串。
申请上述两项 - 如果索引是否定的,则从字符串的末尾开始计算。对于起始和范围情况,起始索引就在字符和与字符串大小匹配的索引之前。 (c)此外,当字符范围的起始索引位于字符串的末尾时,将返回空字符串。
(d)如果初始索引落在字符串之外或长度为负
,则返回nil
s[s.size] # => nil
?因为索引3
没有字符,所以返回nil
。(应用规则 - )。规则-a表示返回指定的字符索引(如果存在)或nil
如果找不到。
s[s.size,1] # => ""
?因为这直接来自 rule-c 。
s[s.size+1,1] # => nil
?因为 rule-d 就是这样说的。
表示nil
是Nilclass
的实例,而''
空字符串是String类的实例。那么你得到的,都是有效的..
s = "abc"
s[s.size].class # => NilClass
s[s.size,1].class # => String