ゲイリー・ライトの説明も参考になりました。
http://www.ruby-forum.com/topic/1393096#990065
ゲイリー・ライトの答えは-
http://www.ruby-doc.org/core/classes/Array.html
ドキュメントは確かにもっと明確かもしれませんが、実際の振る舞いは首尾一貫していて有用です。注:1.9.Xバージョンのストリングを想定しています。
次の方法で番号付けを検討すると役立ちます。
-4 -3 -2 -1 <-- numbering for single argument indexing
0 1 2 3
+---+---+---+---+
| a | b | c | d |
+---+---+---+---+
0 1 2 3 4 <-- numbering for two argument indexing or start of range
-4 -3 -2 -1
よくある(そして理解できる)間違いは、単一引数のインデックスのセマンティクスが2つの引数のシナリオ(または範囲)の最初の引数のセマンティクスと同じであると仮定すること
です。それらは実際には同じものではなく、ドキュメントはこれを反映していません。ただし、エラーは間違いなくドキュメントにあり、実装にはありません。
単一の引数:インデックスは文字列内の単一の文字位置を表します。結果は、インデックスで見つかった1文字の文字列か、指定されたインデックスに文字がないためnilになります。
s = ""
s[0] # nil because no character at that position
s = "abcd"
s[0] # "a"
s[-4] # "a"
s[-5] # nil, no characters before the first one
2つの整数引数:引数は、抽出または置換する文字列の一部を識別します。特に、文字列の幅がゼロの部分も識別できるため、文字列の前や終わりなど、既存の文字の前後にテキストを挿入できます。この場合、最初の引数は文字の位置を識別しませんが、代わりに上の図に示すように文字間のスペースを識別します。2番目の引数は長さで、0にすることもできます。
s = "abcd" # each example below assumes s is reset to "abcd"
To insert text before 'a': s[0,0] = "X" # "Xabcd"
To insert text after 'd': s[4,0] = "Z" # "abcdZ"
To replace first two characters: s[0,2] = "AB" # "ABcd"
To replace last two characters: s[-2,2] = "CD" # "abCD"
To replace middle two characters: s[1..3] = "XX" # "aXXd"
範囲の動作はかなり興味深いです。上記のように2つの引数が指定されている場合、開始点は最初の引数と同じですが、範囲の終了点は、単一のインデックスの場合の「文字位置」または2つの整数引数の場合の「エッジ位置」にすることができます。違いは、ダブルドット範囲またはトリプルドット範囲のどちらを使用するかによって決まります。
s = "abcd"
s[1..1] # "b"
s[1..1] = "X" # "aXcd"
s[1...1] # ""
s[1...1] = "X" # "aXbcd", the range specifies a zero-width portion of
the string
s[1..3] # "bcd"
s[1..3] = "X" # "aX", positions 1, 2, and 3 are replaced.
s[1...3] # "bc"
s[1...3] = "X" # "aXd", positions 1, 2, but not quite 3 are replaced.
これらの例に戻り、二重または範囲のインデックスの例に単一のインデックスのセマンティクスを使用すると、混乱するだけです。実際の動作をモデル化するには、ASCIIダイアグラムに表示される代替の番号付けを使用する必要があります。