Angemeldete Werte Drucken nicht übereinstimmender Werte in SkriptausführungenHallo, ich versuche, ein Verhalten in einer Funktion zu verstehen, die den lokalen Standardbereich verwendet. Die Werte, die in meinen Protokollen erscheinen, wenn ich Print-Anweisungen verwende, stimmen nämlich nicht mit den Werten überein, mit denen mein Code ausgeführt wird. Zum Beispiel in diesem Skript:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
Print("Here:EXAMPLE_VALUE: " || Char(Here:EXAMPLE_VALUE));
Print("EXAMPLE_VALUE: " || Char(EXAMPLE_VALUE));
modal = New Window( "Example Modal",
<<MODAL></MODAL>In meinen Logs sehe ich:
"Here:EXAMPLE_VALUE: 100"
"EXAMPLE_VALUE: 100"
In meinem Modal sehe ich jedoch:
Here:EXAMPLE_VALUE: 100
EXAMPLE_VALUE: .
SkripterstellungBetreff: Angemeldete Werte Drucken nicht übereinstimmende Werte in Skriptausführungen@mat-ski , sind beim Deklarieren des Default Local-Namespace in einer Funktion alle Variablen ohne Bereichsbegrenzung lokal für diese Funktion (siehe Hier ). BEISPIEL_WERT wird außerhalb der Funktion deklariert, sodass das Modal nur dann den richtigen Wert anzeigt, wenn die Variablenreferenz auf Here beschränkt ist. Das Deklarieren von EXAMPLE_VALUE innerhalb der Funktion macht es lokal und für die Funktion verfügbar, aber es würde dann nicht im Here-Namespace existieren, um für den Rest des Skripts zugänglich zu sein. Hier ist ein hilfreiche Seite zur Namespace-Referenzierung .
Betreff: Angemeldete Werte Drucken nicht übereinstimmende Werte in SkriptausführungenLaut der Dokumentation, die Sie auf den Namespace verwiesen haben, heißt es, dass für benutzerdefinierte Funktionen mit Default Local " Referenzregel ist unverändert" und die Referenzregel für uneingeschränkte Referenzen besagt:
Wenn die Namen standardmäßig hierher -Modus aktiviert ist, sucht JMP an folgenden Stellen nach der Variable:
- Lokal Namensraum
- Hier Namensraum
- aktuelle Datentabelle
Es scheint also, als ob die Dokumentation besagt, dass sie immer noch auf Here zurückgreifen sollte, falls es keine lokale Variable mit dem fraglichen Namen im lokalen Namespace gibt.
Unabhängig davon erscheint es mir problematisch, dass das Verhalten der Print-Anweisung nicht mit dem Verhalten des Kontexts übereinstimmt, aus dem der Print erstellt wird.
Betreff: Angemeldete Werte Drucken nicht übereinstimmende Werte in SkriptausführungenBeim Umgang mit Bereichen in JSL. Ich sage so ziemlich immer, sei einfach explizit, wenn du dich zwischen ihnen bewegst.Ich habe Tage damit verbracht, ein einzelnes Scoping-Problem zu debuggen.
Betreff: Angemeldete Werte Drucken nicht übereinstimmende Werte in SkriptausführungenBasierend auf einigem weiteren Debugging glaube ich, dass ich verstehe, was passiert.
Aktualisierter Code:
Names Default To Here( 1 );
EXAMPLE_VALUE = "100";
showExampleModal = Function( {},
{Default Local},
// (1)
hereStr = "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE );
unqualifiedStr = "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE );
// (2)
hereStrTextBox = Text Box( "Here:EXAMPLE_VALUE: " || Char( Here:EXAMPLE_VALUE ) );
unqualifiedStrTextBox = Text Box( "EXAMPLE_VALUE: " || Char( EXAMPLE_VALUE ) );
// (3)
Print( hereStr );
Print( unqualifiedStr );
modal = New Window( "Example Modal",
<<MODAL></MODAL>
Bei (1) werden die Zuweisungen sofort ausgewertet und wenn sie später an die Druck-/Textbox übergeben werden, sind sie so definiert, wie ich es erwarte. Dies wird durch die Ausgabe von (3) und die ersten Textfelder von (4) bestätigt.
Bei (2) werden die Textfelder zum Zeitpunkt der Ausführung der Zeile erneut ausgewertet, und wenn sie angezeigt werden, werden sie erneut mit den von mir erwarteten Werten definiert. Dies wird durch die letzten beiden Textfelder von (4) bestätigt.
Die mittleren beiden Textfelder von (4) werden tatsächlich nicht sofort ausgewertet, sondern als Ausdrücke an das mittlere Feld (oder vielleicht das Listenfeld?) übergeben und später / in einem anderen Bereich (ich denke, dem Bereich entweder des Listenfelds) ausgewertet oder das mittlere Feld). Infolgedessen ist der Wert von EXAMPLE_VALUE nicht das, was ich erwartet habe, stattdessen ist es der Wert von EXAMPLE_VALUE in einem beliebigen anderen Bereich, in dem er ausgewertet wird (nämlich er ist undefiniert).
Dies scheint durch (5) bestätigt zu werden, der die Prints auch als Ausdrücke weitergibt, die später / in einem anderen Bereich ausgewertet werden.
Ist das richtig?
Betreff: Angemeldete Werte Drucken nicht übereinstimmende Werte in SkriptausführungenBoxen haben ihren eigenen Geltungsbereich. Derzeit machen Sie ein modales Fenster, aber stellen Sie sich vor, Sie wären es nicht und die Funktion wäre geschlossen und alle lokalen Variablen wären jetzt weg.Für solche Sachen mache ich normalerweise so etwas wie.
Names default to here(1);
test = function({something_passed, kwargs={}},
{DEFAULT LOCAL},
// Kwargs
kwarg = Try(kwargs["kwarg"], "default"); // kwarg description
something_not_passed = 14;
nw = new window("Scope",
window:something_not_passed = something_not_passed; // just assignthe variable to the display
window:something_passed = something_passed;
window:something_direct = 42;
buttonbox("OK",
<<SET function=""></SET>