Qual è la sintassi per includere i metodi in un record variante?
-
18-09-2019 - |
Domanda
Ho la seguente definizione del record
E3Vector3T = packed record
public
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
function length: E3FloatT;
function normalize: E3Vector3T;
function crossProduct( const aVector: E3Vector3T ): E3Vector3T;
class operator add( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
class operator subtract( const aVector1, aVector2: E3Vector3T ): E3Vector3T;
class operator negative( const aVector: E3Vector3T ): E3Vector3T;
class operator multiply( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
class operator divide( const aVector: E3Vector3T; const aScalar: E3FloatT ): E3Vector3T;
end;
Quello che ho voluto fare è introdurre una parte disco variante per poter accedere alle tre elementi sia individualmente che come una matrice, cioè.
E3Vector3T = packed record
public
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
function length: E3FloatT;
..
end;
Questo non verrà compilato ( funzione richiede un tipo di risultato a lungo funzione). Tutto ciò che ovvio che sto facendo male, o è questo non è supportato? In tal caso, qualche suggerimento per un modo elegante e performante di accedere ai singoli campi come un array?
P.S. E3FloatT è un tipo semplice alias per singola.
Soluzione
Forse è una svista nel compilatore, ma lo fa compilare qualora i metodi siano dichiarate prima parte variante. Questo sembra una soluzione ragionevole.
E3Vector3T = packed record
public
function length: E3FloatT;
..
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
end;
Altri suggerimenti
Spostare la dichiarazione di funzione verso l'alto in questo modo:
E3Vector3T = packed record
public
function length: E3FloatT;
case boolean of
true: (
x: E3FloatT;
y: E3FloatT;
z: E3FloatT;
);
false: (
elements: packed array[0..2] of E3FloatT;
);
end;
Questa compila in Delphi 2010.