Ich bin mir sicher, dass dies bereits irgendwo gepostet wurde, aber ich konnte es nicht finden.
Ich bin verwirrt, wie der Umfang von Variablen in JSL gehandhabt wird.Könnte jemand helfen, zu klären, wie es funktioniert?
Ich verwende i fast immer als Indexierungsvariable für Schleifen.In meinem Skript habe ich beispielsweise eine for-Schleife mit i als Index, die eine andere Funktion aufruft.In dieser Funktion gibt es eine weitere for-Schleife mit i als Index.Dies war in C/Java/etc. noch nie ein Problem.Es scheint, dass es manchmal in JSL funktioniert und manchmal nicht.Ich habe kein Beispiel, da ich nicht genau herausfinden konnte, wo das Problem auftritt.Ich denke jedoch, dass es sich um ein grundlegendes Verständnis des Umfangs von Variablen in JSL handelt.
In JSL wird eine Variable anhand Ihres Beispiels als Variable mit dem Namen „i“ beschrieben
Namensraum:i
Wenn nichts zum Festlegen eines Namensraums angegeben wird, lautet die formale Spezifikation:
::ich
Da der Standard-Namespace in JSL ein Namespace mit dem Namen „:“ ist, ist das ziemlich seltsam, aber dafür gibt es historische Gründe.Wenn Sie also eintreten
ich = 7;
Was JMP sieht, ist:
::i = 7;
Wenn also in irgendeinem Teil eines JSL-Skripts die Variable i geändert und später darauf verwiesen wird, hat sie den neuen Wert
showit = Function( {I},
Show(I);
);
I = 2;
showit(I);
I=3;
showit(I);
es kehrt zurück
I = 2;
I = 3;
Jetzt kann eine Funktion eine Variable isolieren, indem sie die Variable lokal für die Funktion macht
showit = Function( {I},{I},
I=55;
Show(I);
);
I = 2;
showit(I);
show(i);
Das Ergebnis dieses Codes ist:
I = 55;
i = 2;
Beachten Sie, dass sich der Wert von i für die globale Verwendung nicht geändert hat.
Nun zur letzten Verwirrung:
Als ich sagte, dass der Wert von i geändert werden kann und alle nachfolgenden Verwendungen von i diese Änderung widerspiegeln, bedeutet das, dass er auch in verschiedenen ausgeführten Skripten geändert wird.Wenn also ein neues Skript ausgeführt wird, das die Variable i enthält, hat es den Wert von i, der im vorherigen JSL-Skript festgelegt wurde.Somit ist die Anweisung „Names Default to Here( 1 );“ wurde implementiert.Diese Aussage bewirkt zwei Dinge.Zunächst wird der Namensraum von „:“ in „Here“ geändert.Zweitens werden alle Variablen im „Here“-Namespace auf nur die Variablen im ausgeführten Skript isoliert.Wenn Sie also das folgende Skript haben
Names Default to Here( 1 );
i = 7;
Diese Instanz der Variablen i wird nur durch die Verwendung von i innerhalb des Skripts geändert. Kein anderes Skript hat Zugriff auf die Änderung dieser Variablen i.
PS Die formale Beschreibung der Variablen i lautet:
hier:ich
und jede Variable im Skript, die im Skript erstellt wird, nach „Names Default to Here( 1 );“ Die Anweisung wird automatisch in den Namespace-Aufruf Here eingefügt.
Names Default to Here( 1 );
i = 7;
show(here:i)
Ich kann „here:“ nicht verwenden, um Variablen im here-Namespace explizit anzusprechen?
Warum werden Spaltenadressen zB über " :Sex " vergeben.
Leerer Namespace bedeutet: „ aktuelle Datentabelle() “?