Der to-Operator beschreibt ein gewünschtes Casting, wenn dies erforderlich ist oder dient zur Dokumentation.
to erlaubt eine explizite Umwandlung, auch wenn diese Rechenzeit kostet. Siehe auch as, welcher lediglich als Getter fungiert. (Siehe unten)
Point contains int x, y; Startpoint as Point; Endpoint as Point; Color as int; Segment contains Color = (#FFFFFF), // Default Value Startpoint, Endpont; color is Color(#FFFF00); // Hash leitet Hexadezimalzahl ein p1 is Point( 0, 0 ); p2 is Point( 10, 0 ); start is Startpoint( p1 ); end is Endpoint(p2); seg is Segment( color, p1, p2 ); // ok, Ambivalenzhinweis (p1 und p2 könnten verwechselt sein) seg1 is Segment( color, p1 to Startpoint, p2 to Endpoint ); // ok -> Dokumentation seg2 is Segment( p1, p2 ); // fail: Unbekannte Reihenfolge seg3 is Segment( p1 to Startpoint, p2 to Endpoint ); // ok, Color erhält default value seg4 is Segment( p2 to Endpoint, p1 to Startpoint ); // ok, Color erhält default value seg5 is Segment( start, p2 ); // ok, p2 muss Endpoint sein seg6 is Segment( p2, start ); // ok, Ambivalenzwarnung (nicht hint!) seg7 is Segment( p2 to Endpoint, start ); // ok seg8 is Segment( start, end ); // ok seg9 is Segment( end, start ); // ok -> Klare Typzuordnung seg0 is Segment( end to Startpoint, start to Endpoint ); // gewünschtes Casting: end ist ein Point, Startpoint besitzt einen expliziten Point-Konstruktor
Siehe auch: as
Ziel ist es einen Datentyp in einen anderen zu überführen. Im Idealfall ist der Zieldatensatz bereits vorhanden, in dem Fall funktioniert to wie ein Getter. Hierfür sollte as implementiert werden. Existiert keine to-Implementiertung, so greift der Compiler auf eine vorhandene as Implementierung zurück.
Beispiel:
Loop3d contains
{
points is vector< Point3d >;
}
SegLoop3d contains
{
points is vector< SegPoint3d >;
Loop3d :=
{
result is vector< Point3d >;
for( points )
result.push( value );
return Loop3d( result );
}
}