Ich fand die Erklärung von Gary Wright ebenfalls sehr hilfreich.
http://www.ruby-forum.com/topic/1393096#990065
Die Antwort von Gary Wright lautet -
http://www.ruby-doc.org/core/classes/Array.html
Die Dokumente könnten sicherlich klarer sein, aber das tatsächliche Verhalten ist selbstkonsistent und nützlich. Hinweis: Ich gehe von einer 1.9.X-Version von String aus.
Es ist hilfreich, die Nummerierung folgendermaßen zu berücksichtigen:
-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
Der häufigste (und verständliche) Fehler besteht darin, anzunehmen, dass die Semantik des Einzelargumentindex mit der Semantik des ersten übereinstimmt
Arguments im Szenario (oder Bereich) mit zwei Argumenten übereinstimmt. In der Praxis sind sie nicht dasselbe, und die Dokumentation spiegelt dies nicht wider. Der Fehler liegt jedoch definitiv in der Dokumentation und nicht in der Implementierung:
einzelnes Argument: Der Index repräsentiert eine einzelne Zeichenposition innerhalb der Zeichenfolge. Das Ergebnis ist entweder die einzelne Zeichenfolge, die im Index gefunden wird, oder null, da der angegebene Index kein Zeichen enthält.
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
Zwei ganzzahlige Argumente: Die Argumente identifizieren einen Teil der Zeichenfolge, der extrahiert oder ersetzt werden soll. Insbesondere können auch Teile der Zeichenfolge mit der Breite Null identifiziert werden, so dass Text vor oder nach vorhandenen Zeichen eingefügt werden kann, einschließlich am Anfang oder Ende der Zeichenfolge. In diesem Fall wird das erste Argument nicht eine Zeichenposition identifizieren , sondern statt dem identifiziert , den Raum zwischen den Zeichen , wie im Diagramm oben dargestellt. Das zweite Argument ist die Länge, die 0 sein kann.
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"
Das Verhalten eines Bereichs ist ziemlich interessant. Der Startpunkt ist der gleiche wie das erste Argument, wenn zwei Argumente angegeben werden (wie oben beschrieben), aber der Endpunkt des Bereichs kann die 'Zeichenposition' wie bei der Einzelindizierung oder die "Kantenposition" wie bei zwei ganzzahligen Argumenten sein. Die Differenz wird dadurch bestimmt, ob der Doppelpunktbereich oder der Dreifachpunktbereich verwendet wird:
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.
Wenn Sie diese Beispiele noch einmal durchgehen und darauf bestehen, die Einzelindexsemantik für die Doppel- oder Bereichsindizierungsbeispiele zu verwenden, werden Sie nur verwirrt. Sie müssen die alternative Nummerierung verwenden, die ich im ASCII-Diagramm zeige, um das tatsächliche Verhalten zu modellieren.