#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

#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

Sven2, Juli 2001
Günther, Dezember 2007
Der Tod, Oktober 2019