Gary Wright'ın açıklamasını da çok faydalı buldum.
http://www.ruby-forum.com/topic/1393096#990065
Gary Wright'ın yanıtı -
http://www.ruby-doc.org/core/classes/Array.html
Dokümanlar kesinlikle daha açık olabilirdi, ancak gerçek davranış kendi kendine tutarlı ve kullanışlı. Not: String'in 1.9.X sürümünü varsayıyorum.
Numaralandırmayı aşağıdaki şekilde düşünmeye yardımcı olur:
-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
Yaygın (ve anlaşılabilir) hata, tek bağımsız değişken dizinin anlambiliminin , iki bağımsız değişken senaryosundaki (veya aralığındaki) ilk bağımsız değişkenin anlamıyla aynı olduğunu varsayar
. Pratikte aynı şey değildirler ve belgeler bunu yansıtmaz. Ancak hata kesinlikle dokümantasyonda ve uygulamada değil:
tek argüman: dizin, dize içindeki tek bir karakter konumunu temsil eder. Sonuç, dizinde bulunan tek karakter dizgisidir veya verilen dizinde hiçbir karakter olmadığından nil olur.
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
iki tamsayı bağımsız değişkeni: bağımsız değişkenler dizenin ayıklanacak veya değiştirilecek bir bölümünü tanımlar. Özellikle, dizenin sıfır genişlikli kısımları da tanımlanabilir, böylece metin dizenin önü veya sonu dahil olmak üzere mevcut karakterlerden önce veya sonra eklenebilir. Bu durumda, ilk argüman yok değil bir karakter pozisyonunu tanımlamak, ancak yukarıdaki şemada gösterildiği gibi yerine karakterler arasındaki boşluğu tanımlar. İkinci argüman, 0 olabilen uzunluktur.
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"
Bir aralığın davranışı oldukça ilginç. İki argüman sağlandığında (yukarıda açıklandığı gibi) başlangıç noktası ilk argümanla aynıdır, ancak aralığın bitiş noktası, tek indekslemede olduğu gibi 'karakter konumu' veya iki tamsayı argümanında olduğu gibi "kenar konumu" olabilir. Fark, çift nokta aralığının mı yoksa üç nokta aralığının mı kullanıldığına göre belirlenir:
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.
Bu örneklere geri dönüp, çift veya aralıklı dizin oluşturma örnekleri için tek dizin semantiğini kullanmakta ve ısrar ederseniz, kafanız karışacaktır. Ascii diyagramında gösterdiğim alternatif numaralandırmayı gerçek davranışı modellemek için kullanmalısınız.