#strict
Bei aktiviertem #strict werden einige
Altlasten der Engine ignoriert und es können unter anderem strengere Typüberprüfungen angesetzt
werden.
Deklaration
#strict muss als Direktive an den Anfang des Scriptes geschrieben werden. Bei #include und
#appendto gilt jeweils der Modus des Scriptes, zu dem includet/angehängt wird.
Auswirkungen
#strict 2
Bei aktiviertem #strict 2 werden einige
Altlasten der Engine ignoriert und es können unter anderem strengere Typüberprüfungen angesetzt
werden.
Deklaration
#strict 2 muss als Direktive an den Anfang des Scriptes geschrieben werden. Bei #include und
#appendto gilt jeweils der Modus des Scriptes, in dem die Funktion definiert wurde.
Auswirkungen
-
&& und || führen den zweiten Parameter nicht aus, wenn das Ergebnis schon nach Auswertung des ersten feststeht.
-
return, if und while nehmen nur noch einen Parameter. Auch an anderen Stellen nimmt der Parser Ausdrücke nicht mehr an, vor denen früher nur gewarnt wurde.
-
== und != vergleichen nicht mehr die Identität von Werten, sondern ihren Inhalt und Typ. Beispielsweise gilt jetzt [1,2]==[2-1,2], "Hallo"=="Hallo" und CastInt(CLNK)!=CLNK.
- Funktions- und Variablennamen dürfen nur noch die Zeichen a-z, A-Z und _, sowie 0-9 in der Mitte des Namens enthalten.
-
eq, ne, S= gibt es nicht mehr. Man kann jetzt Funktionen und Variablen eq und ne nennen oder eine Variable namens S mit S=42; ändern.
#strict 3
Neu geschriebene Scripte sollten #strict 3 sein. Dabei werden einige weitere
Altlasten der Engine ignoriert, noch strengere Typüberprüfungen angesetzt und neue Sprachfeatures aktiviert.
Scripte ohne #strict 3 werden nur aus Gründen der Abwärtskompatibilität akzeptiert.
Deklaration
#strict 3 muss als Direktive an den Anfang des Scriptes geschrieben werden. Bei #include und
#appendto gilt jeweils der Modus des Scriptes, in dem die Funktion definiert wurde.
nil
Mit #strict 3 wird der neue Wert nil eingeführt.
nil repräsentiert ungesetzte und undefinierte Werte und hat den Typ any.
Weiters wird 0 und false nicht mehr implizit zu any konvertiert, sondern bleiben jetzt int bzw. bool.
Dies ermöglicht unter anderem default-Werte für Parameter ungleich 0/false zu definieren, die trotzdem durch 0/false überschrieben werden können.
nil ist ungleich jeder Wert anderen Typs inklusive 0 und false, es reicht also aus auf x != nil zu überprüfen, um festzustellen ob ein Wert gesetzt ist.
!nil ist allerdings true.
Da 0 und false nicht mehr any sind, können diese Werte nicht mehr zu anderen Typen wie string, object, array oder map konvertiert werden, was zu einem Error führen würde.
Deshalb muss bei Funktionsargumenten dieser Typen auch nil statt 0 verwendet werden, um die jeweiligen Parameter als "ungesetzt" zu definieren.
Der ?-Modifier
Ebenfalls wird ein neuer Modifier eingeführt, der "sichere" Navigation erlaubt. ? wird dazu vor die Navigationsoperatoren gesetzt um eines der folgenden Konstrukte zu erhalten:
?., ?[i], ?-> oder ?->~.
Bei Verwendung des ?-Modifiers führen diese Zugriffe nicht zu einem Error, falls der zugrundeliegende Wert nil ist, sondern brechen den ganzen Ausdruck ab und lassen ihn als Ergebnis nil liefern.
Da man bei Angabe dieses Modifiers annimmt, dass das Ergebnis des Ausdrucks manchmal nil werden kann, liefert der gesamte Ausdruck nie eine Referenz, sondern immer nur den dereferenzierten Wert. Das hat den Hintergrund, dass sonst bei Verwendung des Ausdruckergebnisses als Referenz unabdingbar Errors entstehen können, wodurch der Sinn des Modifiers zunichte gemacht wird.
Weitere Auswirkungen
- Maps und die .-Zugriffssyntax werden verfügbar.
-
Aufrufberechtigungen werden auch bei Verwendung der
-> Syntax überprüft, vorausgesetzt das Ziel-Script ist ebenfalls #strict 3 oder höher.
-
global-> und global->~ werden verfügbar.
-
false != 0 und true != 1
Sven2, Juli 2001
Günther, Dezember 2007
Der Tod, Oktober 2019