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:
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.
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%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 ...
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.
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.
Tags und Links ruby local-variables