1
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]从该字符串返回子字符串。这是否意味着单字符串与子字符串不同?

4

2 回答 2

3

这是否意味着单字符串与子字符串不同?

不,这意味着它的String#[]行为取决于传递给它的参数。

您正在尝试访问字符串的最后一个字符。

str[str.length]

返回nil,因为那里没有字符。

该文档指出:

nil如果初始索引落在字符串之外或长度为负,则返回。

str[-1]

返回最后一个字符,并且...

str[-1].class

返回String

相似地...

str[str.length, 1]

返回空字符串""

同样,文档状态(强调我的):

如果传递了start索引和 a length,则返回包含length从索引开始的字符的子字符串。

由于 结束后不再有字符str,因此该子字符串为空。

于 2013-10-02T09:33:14.780 回答
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)。规则 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
于 2013-10-02T09:27:12.410 回答