¿Cuál es la sintaxis para la inclusión de métodos en un registro variante?
-
18-09-2019 - |
Pregunta
Tengo la siguiente definición de registro
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 variante registro 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;
Esto no se compilará ( función necesita un tipo de resultado a longitud de función). Cualquier cosa obvia que estoy haciendo mal, o se trata no es compatible? En ese caso, cualquier sugerencia de una manera elegante y performant de acceder a los campos individuales como una matriz?
p.s. E3FloatT es un simple alias de tipo para individual.
Solución
Tal vez es un descuido en el compilador, pero sí compilar cuando se declaran los métodos antes de la parte variante. Esto parece una solución razonable.
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;
Otros consejos
Mover la declaración de función en la parte superior de esta manera:
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;
Esto compila en Delphi 2010.