Tengo el siguiente definición de registro¿Cuál es la sintaxis para incluir métodos en un registro de variantes?
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;
Lo que quería hacer es introducir una parte récord variante para poder acceder a los tres elementos de forma individual y como una matriz, es decir
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;
Este no se compilará (la función necesita un tipo de resultado en la longitud de la función). ¿Algo obvio que estoy haciendo mal, o esto no es compatible? En ese caso, ¿hay alguna sugerencia para una forma elegante pero efectiva de acceder a los campos individuales como una matriz?
p.s. E3FloatT es un alias de tipo simple para Single.
No es un descuido. Al igual que siempre, la parte variante de un registro de variante * debe * siempre ser declarada como la última. –
Desde los días de Wirth Pascal ... – gabr
@ Allen: ... por supuesto, ¡gracias! Siempre pensé que esa regla particular estaba allí para hacer que el acceso a los datos fuera más directo, nunca se me ocurrió que existía por razones gramaticales. :RE –