为什么Ruby会返回`str [-1..1]`它的作用是什么?

时间:2016-11-28 01:43:27

标签: ruby string

假设我们有一个字符串str。如果str仅包含一个字符,例如str = "1",则str[-1..1]会返回1
但是,如果size的{​​{1}}(length)长于1 str,则str = "anything else"会返回str[-1..1](空字符串)。

为什么Ruby会像这样解释字符串切片?

3 个答案:

答案 0 :(得分:6)

这种行为就是角色范围的工作原理。

范围start是-1,这是字符串中的最后一个字符。范围结束为1,这是从头开始的第二个位置。

因此,对于一个字符串,这相当于0..1,即单个字符。

对于两个字符的字符串,这是1..1,这是第二个字符。

对于三个字符的字符串,这是2..1,这是一个空字符串。等等更长的字符串。

答案 1 :(得分:3)

要获得一个非平凡的子字符串,起始位置必须表示比结束位置更早的位置。

对于单长度字符串,索引-1与索引0相同,后者小于1。因此,[-1..1]给出了一个非平凡的子字符串。

对于长度超过单个字符的字符串,索引-1大于索引0。因此,[-1..1]不能提供非平凡的子字符串,默认情况下,它返回一个空字符串。

答案 2 :(得分:1)

写下索引通常有助于我:

#      0   1   2   3   4   5   6   7   8   9   10  11  12
str = 'a' 'n' 'y' 't' 'h' 'i' 'n' 'g' ' ' 'e' 'l' 's' 'e' #=> "anything else"
#     -13 -12 -11 -10 -9  -8  -7  -6  -5  -4  -3  -2  -1

您可以通过正面或负面索引来引用每个字符。例如,您可以使用3-10来引用"t"

str[3]   #=> "t"
str[-10] #=> "t"

7-6引用"g"

str[7]  #=> "g"
str[-6] #=> "g"

同样,您可以使用这些索引中的每一个来通过范围检索"thing"

str[3..7]    #=> "thing"
str[3..-6]   #=> "thing"
str[-10..7]  #=> "thing"
str[-10..-6] #=> "thing"
然而,

str[-1..1]会返回一个空字符串,因为-1表示最后一个字符,而1表示第二个字符。它等同于str[12..1]

但如果字符串由单个字符组成,则该范围变为有效:

#      0
str = '1'
#     -1

str[-1..1] #=> "1"

事实上,1是指第一个字符之后的索引,因此0就够了:

str[-1..0] #=> "1"