Tôi thấy lời giải thích của Gary Wright cũng rất hữu ích.
http://www.ruby-forum.com/topic/1393096#990065
Câu trả lời của Gary Wright là -
http://www.ruby-doc.org/core/groupes/Array.html
Các tài liệu chắc chắn có thể rõ ràng hơn nhưng hành vi thực tế là tự nhất quán và hữu ích. Lưu ý: Tôi đang giả sử phiên bản Chuỗi 1.9.X.
Nó giúp xem xét việc đánh số theo cách sau:
-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
Lỗi phổ biến (và dễ hiểu) là quá giả định rằng ngữ nghĩa của chỉ số đối số duy nhất giống như ngữ nghĩa của
lần đầu tiên đối số trong hai kịch bản đối số (hoặc phạm vi). Chúng không giống nhau trong thực tế và tài liệu không phản ánh điều này. Lỗi mặc dù chắc chắn là trong tài liệu và không phải trong quá trình thực hiện:
đối số duy nhất: chỉ mục biểu thị một vị trí ký tự đơn trong chuỗi. Kết quả là chuỗi ký tự đơn được tìm thấy tại chỉ mục hoặc nil vì không có ký tự nào trong chỉ mục đã cho.
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
hai đối số nguyên: các đối số xác định một phần của chuỗi cần trích xuất hoặc thay thế. Đặc biệt, các phần có độ rộng bằng không của chuỗi cũng có thể được xác định để văn bản có thể được chèn trước hoặc sau các ký tự hiện có, kể cả ở phía trước hoặc cuối chuỗi. Trong trường hợp này, đối số đầu tiên không xác định vị trí ký tự mà thay vào đó xác định khoảng trắng giữa các ký tự như trong sơ đồ trên. Đối số thứ hai là độ dài, có thể là 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"
Hành vi của một phạm vi là khá thú vị. Điểm bắt đầu giống như đối số đầu tiên khi hai đối số được cung cấp (như được mô tả ở trên) nhưng điểm cuối của phạm vi có thể là 'vị trí ký tự' như với lập chỉ mục đơn hoặc "vị trí cạnh" như với hai đối số nguyên. Sự khác biệt được xác định bởi liệu phạm vi hai chấm hoặc ba chấm được sử dụng:
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.
Nếu bạn quay lại các ví dụ này và nhấn mạnh và sử dụng ngữ nghĩa chỉ mục duy nhất cho các ví dụ lập chỉ mục hai hoặc phạm vi, bạn sẽ chỉ bị nhầm lẫn. Bạn đã phải sử dụng cách đánh số thay thế mà tôi hiển thị trong sơ đồ ascii để mô hình hóa hành vi thực tế.