在变体记录中包含方法的语法是什么?

Pau*_*Jan 9 delphi record variant delphi-2010

我有以下记录定义

  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;
Run Code Online (Sandbox Code Playgroud)

我想要做的是引入一个变体记录部分,以便能够单独和作为一个数组访问这三个元素,即

  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;
Run Code Online (Sandbox Code Playgroud)

这不会编译(函数需要函数长度的结果类型).有什么明显我做错了,还是不支持?在这种情况下,任何建议以优雅而高效的方式访问单个字段作为数组?

ps E3FloatT是Single的简单类型别名.

Lar*_*ens 9

也许它是编译器中的疏忽,但是当在变量部分之前声明方法时它会编译.这似乎是合理的解决方案.

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;
Run Code Online (Sandbox Code Playgroud)

  • 这不是疏忽.就像它一直以来一样,变体记录*的变体部分必须*始终最后声明. (9认同)

Vil*_*nde 6

将函数声明移动到顶部,如下所示:

  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;
Run Code Online (Sandbox Code Playgroud)

这在Delphi 2010中编译.