#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