2016-06-14 5 views
1

文字列[1 ..- 1]の仕事ではなく、文字列は、次のブロックでは、ruitはなぜ[-3..1]

puts "fruit"[1..-1] 

が表示されますんこの場合無限大

f r u i t 

0 1 2 3 4 

逆インデックスを使用する場合は、機能しません。私は、これは0として、ruitを返すことを期待するのと同じロジックで

は無限大

puts "fruit"[-4..0] 

f r u i t 

-5 -4 -3 -2 -1 

は、しかし、これは実際には何も返しません表します。いくつかの進歩が4

puts "fruit"[-5..1] 

f r u i t 

-5 -4 -3 -2 -1 

の代わりに5でそれをしようと

- それはちょうどr

を返す0

puts "fruit"[-4..1] 

f r u i t 

-5 -4 -3 -2 -1 

の代わりに1を再度試みますそれはfrを返します。

-

しかし、私は逆インデックスを理解できないようです。 [1..-1]-1は無限大ではありませんか?なぜあなたは逆をしようとすると動作しないのですか?

+4

私はruby配列のドキュメントを見ています.0は最初の要素[-3..1]が3番目の最後の要素から2番目の要素になり、何も返さないことを意味します。 http://ruby-doc.org/core-2.2.0/Array.html要素へのアクセスを見てください。 [1 .. -1]の-1は最後の要素を意味します。 –

+0

私はこれを見てきましたが、私が理解できない唯一のことは[1 .. 1]も同様に非論理的であるということです。 2番目の要素から1番目の要素、最後の要素まで続き、最後に – apdm

+1

Rubyは左から右に作用するので、2番目の下降というより2番目の最後(5番目)になります。 –

答えて

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..-1]は、2番目の要素から最後の要素までのカウントを意味します。

+0

インデックスとして-0(0に等しい)を使用できないのはなぜですか? – sawa

+0

@sawa署名された零点は苦いと痛烈な話題なので、どうして私は怒りを編集しないのですか? – Dmitri

+0

これは理にかなっています。 – sawa

3

それは負のインデックスが正の指数iと負の屈折率jため、それらは同じ位置を発現するように端から数えて位置を表すことが簡単である場合に所定の場合のみ

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

ijの絶対値は、string.lengthより小さい。

あなたが動作していないと主張するケースは、開始位置が終了位置の右側にある場合です。

関連する問題