Erstens können Sie keine puti
implementieren und puti a_var
direkt aufrufen, um die Ausgabe als a_var = value of a_var
zu erhalten. Am Rumpf von puti
sieht Ruby nur die formalen Parameternamen von puti
, es kann nicht die tatsächlichen Parameternamen ableiten.
In einer anderen Sprache wie C / C ++ können Sie Makro um Ihre puti
zu implementieren. Das ist eine andere Geschichte.
Sie können jedoch put :a_var
mit Hilfe von Continuation implementieren. In einer anderen Frage " Können Sie Code im Kontext eines Aufrufers in Ruby einlesen? ", Sony Santos hat eine caller_binding
Die Implementierung sollte etwas geändert werden, da callcc
den Rückgabewert des Blocks bei seiner ersten Rückgabe zurückgibt. Sie erhalten also eine Instanz von Continuation
anstatt von nil
. Hier ist die aktualisierte Version:
Beachten Sie, dass puti
nicht die letzte Anweisung Ihres Programms sein sollte, andernfalls wird der Ruby-Interpreter sofort beendet und die Trace-Funktion hat keine Chance zu laufen. Das ist der Punkt der letzten "Platzhalter" -Linie.
Sie müssen die Bindung des aktuellen Variablenbereichs übernehmen, die Sie mit der Binding-Klasse
Die Methode binding()
gibt ein Binding-Objekt an, das sich an dem Punkt, an dem die Methode aufgerufen wurde, den Kontext merkt. Anschließend übergeben Sie eine Bindung an eval()
und werten die Variable in diesem Kontext aus.
Tags und Links ruby