Typecast/de
LSL Portal | Funktionen | Ereignisse | Typen | Konstanten | Datenflusskontrolle | Script Sammlung | Tutorien |
Um den Datentyp eines Wertes zu verändern muss ein sogenanntes Typecast durchgeführt werden (Typkonvertierung). Es gibt zwei Arten der Typkonvertierung: explizit und implizit. Explizite Typkonvertierung muss durch den Programmierer geschehen, während implizite Typkonvertierung durch den Compiler vorgenommen wird. LSL unterstützt implizite Typkonvertierung von String zu Key und Integer zu Float.
Unterstützte Typecasts | ||||||||
---|---|---|---|---|---|---|---|---|
To | ||||||||
integer | float | string | key | list | vector | rotation | ||
From | integer | x | x | x | x | |||
float | x | x | x | x | ||||
string | x | x | x | x | x | x | x | |
key | x | x | x | |||||
list | x | x | ||||||
vector | x | x | x | |||||
rotation | x | x | x |
Syntax: (Typ)Wert
Konvertiert Wert in Typ.
• Ausdruck | Typ | – | veränderlicher Typ | |
• Ausdruck | Wert | – | Ausdruck oder Konstante |
Wenn Wert ein komplexer Ausdruck ist, kann es sinnvoll sein Klammern zu setzen: (Typ)(Wert)
Beispiele
<lsl> string a = "1.5"; float b = (float)a; integer c = (integer)a;
integer i; i = (integer) 1.23; // 1 i = (integer) -1.23; // -1 i = (integer) "0123"; // 123 i = (integer) "0x12A"; // 298 i = (integer) " -5 "; // -5; leading white space is ignored i = (integer) "105 degrees here, it is a nice day"; // 105; non-numeric text which follows numeric text is ignored i = (integer) "String with no numbers"; // 0
float f; f = (float) "6.2e1"; // 62.0 f = (float) " -16.2°C is seriously cold!"; // -16.2; (float)string also ignores leading whitespace and trailing non-numeric characters // "6.2e1", "6.2e+1", "6.2E1", "6.2E+1" are all equivalent. f = (float) "Nancy"; // any string beginning with "nan" (case insensitive) --
// Mono only: NaN (not a number); LSO: causes a math error
f = (float) "infallible LSL!"; // any string beginning with "inf" (case insensitive) --
// Mono only: Infinity; LSO: causes a math error
string s; s = (string) -PI; // "-3.141593" with precision set to 6 decimal places by zero padding or rounding s = (string) [1, 2.3, "a"]; // "12.300000a" again 6 decimal places, but ... s = (string) <1.0, 2.3, 4.56>; // "<1.00000, 2.30000, 4.56000>" .. now with precision set to 5 decimal places s = (string) <2, 4, 0.0, PI >; // "<2.00000, 4.00000, 0.00000, 3.14159>"
list l; l = (list) ""; // [""] l = (list) <1.0, 2.3, 4.56>; // ["<1.00000, 2.30000, 4.56000>"]
vector v; v = (vector) "<1.0, 2.3, 4.56>"; // <1.0, 2.3, 4.56> v = (vector) "<1.0, 2.3>"; // ZERO_VECTOR (Due to insufficient value)
rotation r; r = (rotation) "<1.0, 2.3, 4.56, 1.0>"; // <1.0, 2.3, 4.56, 1.0> r = (rotation) "<1.0, 2.3, 4.56>"; // ZERO_ROTATION (Due to insufficient value) </lsl>
Anwendung
<lsl>default {
state_entry() { integer iUnixTime = llGetUnixTime(); string sUnixTime = (string)unixTime; string sRegionTime = (string)llGetTimeOfDay(); llSetObjectDesc(sUnixTime); llSetText(sRegionTime, <1.0, 0.0 ,0.0>, 1.0); }
}</lsl>
Anmerkungen
- Der Compiler erlaubt explizites Typecasting auch an Stellen wo dies nicht unbedingt sinnvoll ist und nicht optimale Ergebnisse liefert. Nicht benötigte Typkonvertierung bläht den Code unnötig auf und verlangsamt dessen Ausführung.