Saya menemukan penjelasan oleh Gary Wright juga sangat membantu.
http://www.ruby-forum.com/topic/1393096#990065
Jawaban oleh Gary Wright adalah -
http://www.ruby-doc.org/core/classes/Array.html
Dokumen tentu bisa lebih jelas tetapi perilaku yang sebenarnya konsisten dan bermanfaat. Catatan: Saya mengasumsikan versi 1.9.X dari String.
Ini membantu untuk mempertimbangkan penomoran dengan cara berikut:
-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
Kesalahan umum (dan dapat dimengerti) terlalu berasumsi bahwa semantik indeks argumen tunggal sama dengan semantik
argumen pertama dalam dua skenario argumen (atau rentang). Mereka bukan hal yang sama dalam praktiknya dan dokumentasi tidak mencerminkan hal ini. Kesalahannya jelas ada dalam dokumentasi dan bukan dalam implementasi:
argumen tunggal: indeks mewakili posisi karakter tunggal dalam string. Hasilnya adalah string karakter tunggal yang ditemukan di indeks atau nihil karena tidak ada karakter pada indeks yang diberikan.
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
dua argumen integer: argumen mengidentifikasi bagian dari string untuk diekstraksi atau diganti. Secara khusus, bagian lebar nol dari string juga dapat diidentifikasi sehingga teks dapat dimasukkan sebelum atau setelah karakter yang ada termasuk di bagian depan atau akhir string. Dalam hal ini, argumen pertama tidak mengidentifikasi posisi karakter tetapi malah mengidentifikasi ruang antar karakter seperti yang ditunjukkan pada diagram di atas. Argumen kedua adalah panjang, yang bisa 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"
Perilaku rentang cukup menarik. Titik awal sama dengan argumen pertama ketika dua argumen diberikan (seperti yang dijelaskan di atas) tetapi titik akhir rentang dapat berupa 'posisi karakter' seperti dengan pengindeksan tunggal atau "posisi tepi" seperti dengan dua argumen integer. Perbedaannya ditentukan oleh apakah rentang titik ganda atau rentang titik tiga digunakan:
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.
Jika Anda kembali melalui contoh-contoh ini dan bersikeras dan menggunakan semantik indeks tunggal untuk contoh pengindeksan ganda atau rentang Anda hanya akan bingung. Anda harus menggunakan penomoran alternatif yang saya tunjukkan dalam diagram ascii untuk memodelkan perilaku aktual.