"The Ruby Programming Language" von David Flanagan & Yukihiro Matsumoto besagt Folgendes in Abschnitt 4.5.2 Zuordnung zu KonstantenZuordnung zu konstant innerhalb des Körpers der Methode
Assignment to constants is not allowed within the body of a method.
ich die Prämisse zu verstehen und versuchen, zwei Variationen von Code :
PERSONS = {}
def create_persons(filename)
File.foreach(filename).with_index do |line, number|
array = line.split(' ').unshift(number+1)
hash = {:id => array[0],:first_name => array[1], :last_name => array[2], :email => array[3]}
PERSONS = hash
end
end
ich erhalte eine Fehlermeldung:
santa.rb:13: dynamic constant assignment
PERSONS = hash
^
Ich probiere die zweite Version aus, bei der ich statt eines Gleichheitsoperators ein leeres Array als Konstante initialisiere und den Append-Operator verwende, um einen Hash an ein leeres Array anzuhängen. Das funktioniert!
PERSONS = []
def create_persons(filename)
File.foreach(filename).with_index do |line, number|
array = line.split(' ').unshift(number+1)
hash = {:id => array[0],:first_name => array[1], :last_name => array[2], :email => array[3]}
PERSONS << hash
end
end
Meine Frage ist, warum hat die zweite Version der Arbeit, wenn ich den < < Zuweisungsoperator verwenden, aber funktioniert nicht mit = Zuweisungsoperator.
Warum nicht? Sie ordnen die Konstante nicht zu oder definieren sie neu - Sie tun etwas mit dem Objekt *, auf das mit dieser Konstante verwiesen wird *. Nitpick: '<<' ist keine Art von Aufgabe, es ist eine Methode. –
@ dave-Newton << erschien mir auch wie eine Methode, d. H. Es hängt an. Aber im selben Ruby-Buch, das ich oben erwähnt habe, zeigt es die folgenden Beispiele als abgekürzte Zuweisungen: x << = y (x = x << y) and x >> = y (x = x >> y). Dies ist zu meiner Verwirrung. – PiperWarrior
Ok , @DaveNewton.Ich bekomme jetzt Ihren Kommentar und verstehe den Unterschied zwischen dem Zuweisen (Ändern der Objektreferenz) und dem Ändern des Objekts, auf das die Konstante verweist (Referenz ist auf dasselbe Objekt, aber modifiziert.) Danke. – PiperWarrior