为什么字符串[1 ..- 1]工作但不是字符串[-3..1]

时间:2016-06-14 17:37:02

标签: ruby

以下块将显示ruit

puts "fruit"[1..-1]

因为索引从1开始,我认为在这种情况下-1表示无穷大

f  r  u  i  t

0  1  2  3  4

但是如果我想使用反向索引,它就不起作用。

按照相同的逻辑,我希望这会返回ruit,因为0表示无穷大

puts "fruit"[-4..0]

f    r   u   i   t

-5  -4  -3  -2  -1

然而,这实际上什么都没有。再次使用1而不是0

进行尝试
puts "fruit"[-4..1]

f    r   u   i   t

-5  -4  -3  -2  -1

它只返回r

-

尝试使用5而不是4

puts "fruit"[-5..1]

f    r   u   i   t

-5  -4  -3  -2  -1

取得了一些进展,它返回fr

-

然而,似乎我不理解反向索引。 -1中的[1..-1]不是无穷大吗?当你试图反过来时为什么不起作用?

3 个答案:

答案 0 :(得分:3)

只是负指数代表从末尾算起的位置,对于正指数i和负指数j,它们表示相同的位置,当且仅当< / p>

i % string.length == j % string.length

假设ij的绝对值小于string.length

您声称不起作用的案例是起始位置位于结束位置右侧的情况。

答案 1 :(得分:2)

负数不是“无限”,它们只是表示从字符串末尾开始计数。 -1是最后一个字符,-2是最后一个字符。

"abcde"[-1]
#=> "e"

如果你正在做范围,他们应该总是最低 .. 最高,而在String#[]的情况下,你必须避免包裹在...字符串。你-5..1的例子实际上已经包含了,所以Ruby放弃了,而是选择了0..1。尽量不要混淆和匹配负值和正值。

0永远不代表无穷大,它代表字符串的开头。你在这里遇到的是尝试用坏参数做的方法。

答案 2 :(得分:1)

您可以查看this question

简短回答:在Ruby数组中,负数表示数组末尾的顺序,因为在Ruby中

:001 > -0 == 0
 => true 

然后

"zero"[0] == "zero"[-0]

你不能使用&#34;负零&#34;引用不同的元素。 所以,数组的最后一个元素用-1表示。您可以将其视为基于一个的负数组索引,如God intended

因此,[1..-1]表示从第二个元素到最后一个元素的计数。