为什么在一种情况下需要静态数据,而在另一种情况下却不是静态数据呢?

Pau*_*-AG 1 delphi pascal freepascal

FreePascal,Delphi模式。经过一些实验,我发现该代码已编译,FPC告诉我类过程必须是“静态的”。但是我的问题是:那为什么运算符Equal不需要“静态”并且可以正常编译?我也无法理解“类”过程和“类”与“静态”有什么区别(例如,在Python中,classmethod您获取参数-引用该类,在staticmethod-中您没有此类参数)。

  type TPos = record
    FLine: Word;
    FPos: Word;

    class procedure Init(out a: TPos); static;
    class operator Equal(a, b: TPos): Boolean;
  end;

Run Code Online (Sandbox Code Playgroud)

PS。我设置“ delphi”标签的原因是:1)它是在delphi模式下编写的2)因为我找到了与Delphi相同的文档:关于类和静态关键字。

Dav*_*nan 6

与您声明的相反,非静态类方法确实具有对作为参数传递的类的引用。这是一个名为的隐式参数Self

对于与类相对的记录上的类方法,由于没有继承,因此此Self参数没有任何作用,因此永远不会传递。因此,记录上的所有类方法都必须是静态的。

类运算符隐式地是一个静态方法,因此您无需声明它。换句话说,operator暗含static