2016-06-14 89 views
1

以下块将显示ruit为什么字符串[1 ..- 1]的工作,但不串[-3..1]

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不是指无穷大吗?当你尝试做相反的事时,为什么它不起作用?

+4

我会看看红宝石阵列文档,0意味着第一个元素[-3..1]从第三个元素到第二个元素,因此不会返回任何内容。 http://ruby-doc.org/core-2.2.0/Array.html查看访问元素。 [1 ..- 1]中的-1表示最后一个元素。 –

+0

我已经看过这个,我唯一不明白的是[1..- 1]同样不合逻辑。它会从第二个元素到第一个元素到最后一个元素,然后结束 – apdm

+1

Ruby从左到右工作,所以它会从第二个元素到最后一个元素(第五个),而不是第二个元素。 –

回答

2

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

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

如果你正在做的范围,他们应该永远是最低 ... 最高和你必须避免串绕结束包裹的的String#[]情况。你的例子-5..1实际上是环绕的,所以Ruby放弃了,并且用0..1代替。尽量不要混合和匹配负值和正值。

0永不代表无穷大,它代表字符串的开始。你在这里遇到的是试图用坏论点来做的方法。

+0

不确定“放弃”或“替代”的含义。 '[-5..1]'相当于'[0..1]'。 – sawa

+0

@sawa'String#[]'方法拒绝处理范围中的正值和负值,所以它似乎只是默认将其解释为'0..1'。 '-5 ..- 1'重现整个字符串,'-5..0'被解释为'0..0'。 – tadman

+0

简单说就是索引'-1'等于索引'4',索引'-5'等价于索引'0'。 – sawa

1

你可能会看看this question

简短的回答:在Ruby中数组,负数表示从数组结束的顺序,因为在Ruby中

:001 > -0 == 0 
=> true 

然后

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

,你不能使用“负零“来表示不同的元素。 因此,数组的最后一个元素由-1表示。您可以将其视为基于单数的负数组索引,如God intended

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

+0

为什么你不能有-0(等于0)作为索引? – sawa

+0

@sawa自签名的零是一个痛苦和激烈的话题,为什么我不编辑amswer? – Dmitri

+0

现在它是有道理的。 – sawa

3

这仅仅是负指数表示以这样的方式,对于一个正折射率i和负折射率j,它们所表现的相同的位置从端部计数的位置,当且仅当

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

给出ij的绝对值小于string.length

您声称不工作的情况是开始位置在结束位置右侧的情况。

相关问题