2017-03-15 4 views
-2

Ich verstehe nicht, wie Sie Variablenwert von außerhalb der Methode mit binding und eval ändern. Beispiel Methode:Ruby: Ändern der Variablen außerhalb der Methode

def foo 
    a = 1 
    binding 
end 

kann ich Variable a auf zwei Arten erhalten:

foo.local_variable_get(:a) #=> 1 
# or 
foo.eval("a") #=> 1 

Aber ich kann nicht neuen Wert

foo.local_variable_set(:a, 2) 
foo.local_variable_get(:a) #=> still 1 
foo.eval("a = 2") 
foo.local_variable_get(:a) #=> still 1 

jedoch eingestellt, ich kann es tun, wenn Bindung Objekt wurde im globalen Gültigkeitsbereich außerhalb jeder Methode erstellt:

bar = 123 
binding # Binding object with global scope 
binding.eval("bar") #=> 123 
binding.eval("bar = 456") 
binding.eval("bar") #=> 456 

Wie kann ich einen neuen Wert für die Methode lokale Variable außerhalb der Methode festlegen? Vielen Dank.

+1

Die erste Frage stellt ist, warum tun Sie von außerhalb es eine lokale Variable in einer Methode ändern möchten? Vielleicht verstehen Sie den Unterschied zwischen lokalen, Instanz-, Klassen- und globalen Variablen nicht? Das klingt nach einem "[XY-Problem] (https://meta.stackexchange.com/q/66377/153968)", wo Sie nach einer Sache fragen, aber wirklich nach einer anderen fragen sollten. Erklären Sie das Ziel, warum Sie dies im Rahmen Ihres Programms tun möchten. –

+0

Das ergibt keinen Sinn. Eine lokale Variable wird verwendet, um Werte innerhalb der Methode zu speichern, die keine Persistenz außerhalb der Methode benötigen. Sie werden zerstört, sobald die Methode beendet wird. Wo würden Sie vorschlagen, dass diese Veränderung in einer Methode stattfindet? Bei der Initialisierung des lokalen? Midstream an irgendeiner zufälligen oder willkürlichen Stelle? Ich würde empfehlen, uns einen Codeausschnitt zu zeigen, der zeigt, wie Sie sich vorstellen, solche Funktionen zu verwenden. –

+0

@theTinMan, ich habe darüber [hier] gelesen (https://ruby-doc.org/core-2.0/Binding.html#local_variable_set-method) und versuchte ähnliches Beispiel in irb. Ich will es nur verstehen. – tbard

Antwort

0

In Ihrem Beispiel erstellen Sie immer neue Bindung (Kontext) durch Aufruf foo. Deshalb sind Änderungen verloren.

Es sollte funktionieren, wenn Sie die gleiche Bindung

b = foo 
b.local_variable_get(:a) # => 1 

eval("a = 2", b) 
b.local_variable_get(:a) # => 2 

b.local_variable_set(:a, 3) 
b.local_variable_get(:a) # => 3 
Verwandte Themen