如何处理ruby中的字符串方法`[]`

时间:2013-10-02 09:25:29

标签: ruby

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

2 个答案:

答案 0 :(得分:3)

  

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

没有。这意味着String#[]的行为会有所不同,具体取决于传递给它的参数。

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

str[str.length]

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

The documentation州:

  

如果初始索引超出字符串或长度为负,则返回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 就是这样说的。

表示nilNilclass的实例,而''空字符串是String类的实例。那么你得到的,都是有效的..

s = "abc"
s[s.size].class # => NilClass
s[s.size,1].class # => String