4

私はどのようにArray#[]=動作するかを確認しようとしました:

enum[int] = obj → obj
enum[start, length] = obj → obj
enum[range] = obj → obj

質問1

bインデックスを保持nilする配列が 1 つあり0ます。

b = []
b[0]   # => nil

以下のコードnilで整数に置き換えようとしました。10

b[-1] = 10 # => IndexError: index -1 too small for array; minimum: 0

上記のコードは機能しないのに、以下のコードは機能するのはなぜですか? size の配列の場合1、インデックス0との-1扱いが異なるのはなぜですか?

b[0] = 5   # => 5
b[-1] = 10 # => 10

質問2

size の配列を作成2し、次のことを行いました。

a = [1,2]

a[-3] = 3       # => IndexError: index -3 too small for array; minimum: -2
a[-3] = [3]     # => IndexError: index -3 too small for array; minimum: -2
a[-3..-4] = [3] # => RangeError: -3..-4 out of range

負のインデックスが配列のサイズを大きくすることはないと思いますが、その理由はわかりません。以下のコードが成功したのはなぜですか?

a[-2..-3] = [3,4] #=> [3, 4]
4

3 に答える 3

7

アレイのドキュメントの最初のパラグラフをご覧になることをお勧めします。驚くべきことに、次のように述べています。「負のインデックスは配列の最後に相対的であると見なされます。つまり、インデックス-1は配列の最後の要素を示し、-2は配列の最後の要素の次の要素を示します。オン。」</p>

つまり、 。a[-N]の場合にのみ、この要素を設定できます|N| <= a.sizea = [1,2] ; a[-3] = 3それが失敗する理由です(3> 2)。

一方、ruby配列には[おそらく]文書化されていない機能があります。インデックスのa[INBOUNDS_IDX..NONSENSE_IDX]=SMTH挿入されます。 SMTH INBOUNDS_IDX

a=[1,2]
a[2..0]='a'
a[2..1]='b'
a[2..-100]='c'
# ⇒ [1, 2, "c", "b", "a"]
a[2..-1]='q'
# ⇒ [1, 2, "q"]

ここでのナンセンスとは、「INBOUNDS_IDX未満であり負の表記のインデックスとして扱われない」ことを意味します(そのためa[2..-1]、上記の例ではとして扱われa[2..(a.size - 1)]ます)。

于 2013-02-24T10:03:32.080 に答える
0

Q1:

空の配列には0個の要素があるため、負のインデックスを使用して要素0を設定しようとする-1と、エラーが発生します。負のインデックスは配列の最後から循環するためです。

だから a = []; a[-1] = 3それを不可能にします

a)nullなので、最後の位置にある要素を取得します

b)その値を設定します。キャプチャされなかったので。

a[0] = 5コンパイラに次のように指示しているため、機能します

a)最初の要素を取得します。

b)存在しない場合は作成し、要求した値に割り当てます。

正のインデックスはサイズが大きくなる可能性があることを具体的に述べている公式のAPIドキュメントを参照してください。配列の先頭を超える負のインデックスは、エラーを発生させます。

Q2:

上記の説明は、2番目の質問にもほぼ答えています。

与えられたa = [1,2]

a[-3] = 3ブレークの最初のポイントを引き起こします。存在しない最後から3番目の要素にアクセスしようとしています。設計上、故障します。

a[-2..-3]定義されたアレイのキャプチャ範囲内にある間。

インタプリタに最後から2番目の要素(この場合は前から1番目)をキャプチャするように依頼し、配列のサイズを増やすように要求している範囲を呼び出して、要求したものを入力します。

幸いなことに、すべてがまだ順調で、希望どおりです。知っておくと良い。

于 2013-02-24T09:47:40.330 に答える
0

観察 #1

-1 インデックスは最後の要素に関連しています。配列にサイズ [] がない場合は、1 つ以上の要素で初期化するまで使用できません。

観察 #2:

はい、そうです、配列内の具体的な既存の位置を参照するだけであれば、負のインデックスは配列のサイズを決して増加させません。配列が循環しているとは思わないでください (0 インデックスは N-1 インデックスの手掛かりです)。そのため、有効であると考えて負のインデックスを使用することはできません。

于 2013-02-24T08:21:58.680 に答える