Gibt es in Ruby keine Möglichkeit, eine lokale Variable im aktuellen Kontext dynamisch zu definieren? [Duplikat]

9

Ich frage mich, ob es eine Methode gibt, mit der ich eine bisher undefinierte Variable im aktuellen Kontext dynamisch definieren kann. Zum Beispiel:

%Vor%

Anders ausgedrückt, da foo nicht definiert ist, suche ich nach einem Code, mit dem ich die lokale Variable foo definieren kann, ohne die Variable foo zu benutzen (zB wenn ich eine andere Variable% co_de hätte %, deren Wert bar war, und ich musste mich darauf verlassen, um den Wert von :foo ) zu setzen.

Es scheint, dass foo oder eval('foo = 1') oder in Ruby 2.1, eval('foo = 1', binding) alle gleichwertig sind mit:

%Vor%

Mit anderen Worten: Sie setzen binding.local_variable_set(:foo, 1) im Kontext eines neuen lokalen Kontexts, so dass der Wert außerhalb dieses Kontexts nicht zugänglich ist.

Was kann ich tun?

Update: Diese Frage ist nicht spezifisch für einen bestimmten lokalen Variablenkontext (Modul / Klasse, Methode, Proc, Block, etc.). Ich wäre daran interessiert, jeden Kontext zu kennen, in dem es möglich ist oder nicht getan werden kann.

    
Peter Alfvin 11.10.2013, 15:21
quelle

3 Antworten

9

Es scheint, dass Rubys Magie einen Weg bieten würde, aber laut Matz war das nur in 1.8 via eval und nur in bestimmten Kontexten möglich (d. h. irb ). Ab 1.9 wurde dieses Verhalten aufgehoben ("strikt verboten"):

Matz selbst wiegt hier ein: Ссылка

  
    

Ich habe von irgendwo gelesen, dass Ruby jetzt keine lokale Variable dynamisch erstellen kann. Ist es wahr oder nur ein Fehler?

  
     

Die lokalen Variablen werden in der Kompilierzeit erstellt, also lokal   Variablen, die in eval () definiert sind, können nicht außerhalb von aufgerufen werden   Eval. In 1.8 führt irb und tryruby zeilenweise Kompilierung durch   Lokale Variablen werden von eval () verschüttet, aber in 1.9 ist es streng   verboten, auch bei einer zeilenweisen Kompilierung.

%Vor%

(Nicht-sequitur alternative hier, für jeden, der so etwas will, aber nicht die genaue technische Situation, die der Fragesteller hat):

Verwenden Sie einen Hash:

%Vor%     
Dan Nguyen 11.10.2013, 17:22
quelle
2

Im Zusammenhang mit der Erstellung der lokalen Variablen selbst gibt es zwar einige Schwierigkeiten zu überwinden, aber die dynamische Zuweisung ist immer noch kein Problem.

%Vor%

Erstellen Sie einfach aus einer zusammengetragenen Eingabe (aus gets , chomped oder stripped nach Bedarf, wird es natürlich als String enden) und rufen Sie to_sym auf und stopfen das neue Symbol in local_variables und Eval weg ...

%Vor%

Dann nimmst du die gesammelte Zeichenkette, die du in ein Symbol umgewandelt hast, in dem oben gezeigten Code und überprüfst es, um den Wert zu erhalten.

%Vor%

Wie in einer anderen Antwort erwähnt, kann ich dies außerhalb von Pry oder IRB nicht einfach replizieren.

Dies hat sich in zukünftigen Versionen von Ruby geändert, da Matz das entfernt hat und hart arbeitet, damit dies nicht mehr passieren kann.

    
vgoff 11.10.2013 21:30
quelle
0

Würde eine Klasseninstanzvariable für Sie arbeiten?

%Vor%

Wenn nicht, erläutern Sie bitte den Kontext und wie Sie die lokale Variable verwenden würden.

    
Cary Swoveland 11.10.2013 20:04
quelle

Tags und Links