게리 라이트의 설명도 도움이되었습니다.
http://www.ruby-forum.com/topic/1393096#990065
게리 라이트의 대답은-
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
일반적이고 이해하기 쉬운 실수는 단일 인수 색인의 의미가 두 인수 시나리오 (또는 범위)에서 첫 번째 인수 의 의미와 동일하다고 가정합니다
. 그것들은 실제로 같은 것이 아니며 문서에는 이것을 반영하지 않습니다. 오류는 분명히 문서에 있으며 구현에는 없습니다.
단일 인수 : 색인은 문자열 내 단일 문자 위치를 나타냅니다. 주어진 색인에 문자가 없기 때문에 결과는 색인에서 찾은 단일 문자열이거나 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
두 개의 정수 인수 : 인수는 추출하거나 바꿀 문자열 부분을 식별합니다. 특히, 문자열의 폭이 0 인 부분을 식별하여 문자열의 앞이나 끝을 포함하여 기존 문자 앞이나 뒤에 텍스트를 삽입 할 수 있습니다. 이 경우 첫 번째 인수는 문자 위치를 식별 하지 않고 위의 다이어그램에 표시된 것처럼 문자 사이의 공백을 식별합니다. 두 번째 인수는 길이이며 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.
이 예제를 다시 살펴보고 double 또는 range 인덱싱 예제에 단일 인덱스 의미론을 사용하고 고집한다면 혼란 스러울 것입니다. 실제 동작을 모델링하기 위해 아스키 다이어그램에 표시되는 대체 번호 매기기를 사용해야합니다.