代码之家  ›  专栏  ›  技术社区  ›  Paul-Jan

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

  •  9
  • Paul-Jan  · 技术社区  · 16 年前

    我有以下记录定义

      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.e3float是single的简单类型别名。

    2 回复  |  直到 16 年前
        1
  •  9
  •   Lars Truijens    16 年前

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

    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;
    
        2
  •  6
  •   Ville Krumlinde    16 年前

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

      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;
    

    它在Delphi2010中编译。