ฉันพบคำอธิบายโดย Gary Wright ที่เป็นประโยชน์เช่นกัน
http://www.ruby-forum.com/topic/1393096#990065
คำตอบของ Gary Wright คือ -
http://www.ruby-doc.org/core/classes/Array.html
เอกสารชัดเจนยิ่งขึ้น แต่พฤติกรรมที่แท้จริงนั้นสอดคล้องกับตนเองและมีประโยชน์ หมายเหตุ: ฉันสมมติว่ารุ่น String 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
ข้อผิดพลาดทั่วไป (และเข้าใจได้) นั้นถือว่าเกินไปว่าซีแมนทิกส์ของดัชนีอาร์กิวเมนต์เดียวนั้นเหมือนกับความหมายของ
อาร์กิวเมนต์แรกในสถานการณ์สมมติอาร์กิวเมนต์สองรายการ (หรือช่วง) มันไม่เหมือนกันในทางปฏิบัติและเอกสารไม่ได้สะท้อนสิ่งนี้ แม้ว่าข้อผิดพลาดนั้นแน่นอนในเอกสารประกอบและไม่ใช่ในการนำไปใช้งาน:
อาร์กิวเมนต์เดียว: ดัชนีแสดงถึงตำแหน่งอักขระเดียวภายในสตริง ผลลัพธ์เป็นสตริงอักขระเดี่ยวที่พบที่ดัชนีหรือไม่มีเนื่องจากไม่มีอักขระที่ดัชนีที่กำหนด
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
อาร์กิวเมนต์จำนวนเต็มสองข้อ: อาร์กิวเมนต์ระบุส่วนของสตริงที่ต้องการแยกหรือแทนที่ โดยเฉพาะอย่างยิ่งส่วนที่มีความกว้างเป็นศูนย์ของสตริงสามารถระบุได้เพื่อให้สามารถแทรกข้อความก่อนหรือหลังอักขระที่มีอยู่ซึ่งรวมถึงที่ด้านหน้าหรือท้ายของสตริง ในกรณีนี้อาร์กิวเมนต์แรกไม่ได้ระบุตำแหน่งของอักขระ แต่จะระบุช่องว่างระหว่างอักขระตามที่แสดงในแผนภาพด้านบนแทน อาร์กิวเมนต์ที่สองคือความยาวซึ่งสามารถเป็น 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"
พฤติกรรมของช่วงนั้นค่อนข้างน่าสนใจ จุดเริ่มต้นเป็นเช่นเดียวกับอาร์กิวเมนต์แรกเมื่อมีการให้สองอาร์กิวเมนต์ (ตามที่อธิบายข้างต้น) แต่จุดสิ้นสุดของช่วงสามารถเป็น 'ตำแหน่งอักขระ' เช่นเดียวกับการจัดทำดัชนีเดียวหรือ "ตำแหน่งขอบ" เช่นเดียวกับอาร์กิวเมนต์จำนวนเต็มสองตัว ความแตกต่างนั้นพิจารณาจากการใช้ช่วงจุดสองจุดหรือจุดสามจุด:
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 เพื่อจำลองพฤติกรรมที่แท้จริง