【问题标题】:What's the syntax for including methods in a variant record?在变体记录中包含方法的语法是什么?
【发布时间】:2010-03-09 21:12:34
【问题描述】:

我有以下记录定义

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

【问题讨论】:

    标签: delphi delphi-2010 record variant


    【解决方案1】:

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

    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;
    

    【讨论】:

    • 这不是疏忽。就像往常一样,变体记录的变体部分必须总是最后声明。
    • @Allen:……当然,谢谢!我一直认为特定规则的存在是为了使数据访问更加直接,我从来没有想到它是出于语法原因而存在的。 :D
    【解决方案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;
    

    这在 Delphi 2010 中编译。

    【讨论】:

      猜你喜欢
      • 2014-04-13
      • 2022-10-08
      • 1970-01-01
      • 1970-01-01
      • 2018-07-31
      • 1970-01-01
      • 2016-01-25
      • 2011-08-28
      • 1970-01-01
      相关资源
      最近更新 更多