Каков синтаксис включения методов в вариантную запись?
-
18-09-2019 - |
Вопрос
У меня есть следующее определение записи
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;
Я хотел ввести вариантную часть записи, чтобы иметь возможность доступа к трем элементам как по отдельности, так и в виде массива, т.е.
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;
Это не скомпилируется(функции нужен тип результата по длине функции).Что-то очевидно, что я делаю неправильно, или это не поддерживается?В этом случае есть ли какие-нибудь предложения по элегантному, но производительному способу доступа к отдельным полям в виде массива?
п.с.E3FloatT — это простой псевдоним типа Single.
Решение
Возможно, это ошибка компилятора, но он компилируется, когда методы объявляются перед вариантной частью.Это кажется разумным решением.
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;
Другие советы
Переместите объявление функции наверх следующим образом:
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;
Это компилируется в Delphi 2010.