2016-06-01 6 views
1

"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.

+3

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. –

+0

@ 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

+0

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

Antwort

1

Die seltsame Sache über Konstanten in Ruby ist Sie können sie einmal definieren, aber ändern sie endlos, es sei denn, sie sind eingefroren. Die erste ist ein Problem, weil Sie wechseln, welches Objekt PERSONS bezieht. Im zweiten Fall fügen Sie etwas zu einem bestehenden Objekt hinzu, dies ist erlaubt.

Technisch ist es möglich, Konstanten neu zu definieren, aber das wird am besten vermieden.

+0

Ich würde nicht sagen, dass es ist Ich denke, die meisten oder zumindest viele OOP-Sprachen mit veränderbaren Objekten verhalten sich ähnlich. –

+0

Sage im Vergleich zu "const" in anderen Sprachen. Sie sind kaum "konstant" in Ruby! – tadman

+0

Das ist was ich meine. Abgesehen von Rubys sehr seltsamer Fähigkeit, Konstanten neu zuzuweisen, verhalten sich seine Konstanten sehr ähnlich wie Variablen, die mit 'const' initialisiert wurden und auf ein Objekt C++ oder Objective-C verweisen, oder 'final' in Java,' readonly' in C#, let 'in Swift (für Referen ce-Typen, d. h. Klassen, aber keine Strukturen), oder "const" in JavaScript. –

Verwandte Themen