Каков синтаксис для включения методов в различной записи?

У меня есть следующее рекордное определение

  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;

Это не скомпилирует (для функции нужен тип результата в функциональной длине). Что-либо очевидное, которое я делаю неправильно, или разве это не поддерживается? В этом случае, какие-либо предложения для изящного все же производительного способа получить доступ к отдельным полям как к массиву?

p.s. E3FloatT является простым псевдонимом типа для Единственного.

9
задан Lars Truijens 10 March 2010 в 08:02
поделиться

2 ответа

Возможно, это недосмотр компилятора, но он компилируется, когда методы объявляются перед вариантной частью. Это кажется разумным решением.

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;
9
ответ дан 4 December 2019 в 13:47
поделиться

Переместите объявление функции наверх следующим образом:

  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.

6
ответ дан 4 December 2019 в 13:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: