2 Stimmen

Warum erhalte ich im IRB und in einem Skript unterschiedliche Ergebnisse?

Gibt es einen Unterschied in der Art und Weise, wie IRB und Ruby einige Ausdrücke ausführen?

Diese Ausdrücke liefern im IRB und bei der Ausführung über die Befehlszeile unterschiedliche Ergebnisse. Die Frage ist, welcher Ausdruck richtig ist.

IRB:

>> s = 'hello'
=> "hello"
>> s.size
>> s[s.length] = '!'
IndexError: index 5 out of string
    from (irb):31:in `[]='
    from (irb):31
>> 

Und in der normalen Schrift:

s = 'hello'
s[s.length] = '!'
puts s

laptop user$ ./prgruby.rb 
hello!

0 Stimmen

Die erste funktionierte für mich von der irb-Eingabeaufforderung. ruby 1.9.2p0 auf Windows.

0 Stimmen

1.9.2p290/OSX, keine der beiden Ausnahmen auslöst.

3 Stimmen

Vielleicht laufen diese Skripte in verschiedenen Ruby's. Überprüfen Sie dies, indem Sie die Ruby-Version zur Laufzeit ausgeben.

1voto

Adrien Coquio Punkte 4830

Ici ist der Doc von String#[] para 1.8.7 :

str[fixnum] = fixnum

Die Formulare, die eine Fixnum annehmen, lösen einen IndexError aus, wenn der Wert außerhalb des Bereichs

Ici ist das gleiche Dokument für 1.9.3 : Die gleiche Definition ist vorhanden

Nach dem Test passiert in Ruby 1.9.3 folgendes s.length nicht außerhalb des Bereichs für die Zuweisung liegt. Das macht Sinn, wenn es sich um das Ende der Zeichenkette handelt: Sie müssen die fehlenden Indizes nicht willkürlich auffüllen, aber ich schätze, das kann oder sollte irgendwo dokumentiert sein?

0 Stimmen

Ja, ich finde diese Operationen zum Ersetzen/Zuordnen/Aufschneiden von Zeichenfolgen etwas merkwürdig. Zum Beispiel: s[s.size,1] gibt einen leeren String zurück, obwohl wir außerhalb des Bereichs suchen - es sei denn, die Strings werden wie in C mit ' \0 ' Zeichen. s[s.size+1,1] auf der anderen Seite gibt null zurück, was die Theorie der "String-Finalisierung" bestätigen könnte... würde es jedenfalls begrüßen, wenn mir jemand hier ein paar Hinweise geben könnte...

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X