Delphi 为什么在一种情况下需要静态,而在另一种情况下不是强制性的?
FreePascal,Delphi模式。经过一些实验,我发现这段代码是编译的,FPC告诉我类过程必须是“静态的”。但我的问题是:那么为什么操作符Delphi 为什么在一种情况下需要静态,而在另一种情况下不是强制性的?,delphi,pascal,freepascal,Delphi,Pascal,Freepascal,FreePascal,Delphi模式。经过一些实验,我发现这段代码是编译的,FPC告诉我类过程必须是“静态的”。但我的问题是:那么为什么操作符Equal不需要“静态”,而且编译很好?!我也不明白“class”过程和“class”与“static”有什么区别(例如,在Python中classmethod中,您得到参数-对类的引用,在staticmethod中,您没有这样的参数) 类型TPos=记录 弗林:字; FPos:单词; 类程序初始化(输出a:TPos);静止的 类运算符Equal(a,b
Equal
不需要“静态”,而且编译很好?!我也不明白“class”过程和“class”与“static”有什么区别(例如,在Python中classmethod
中,您得到参数-对类的引用,在staticmethod
中,您没有这样的参数)
类型TPos=记录
弗林:字;
FPos:单词;
类程序初始化(输出a:TPos);静止的
类运算符Equal(a,b:TPos):布尔;
终止
另外,我设置“delphi”标记是因为:1)它是在delphi模式下编写的2)因为我找到了相同的delphi文档:关于类和静态关键字。与您所说的相反,非静态类方法确实有一个作为参数传递的类引用。这是一个名为
Self
的隐式参数
对于记录上的类方法而不是类,因为没有继承,所以这个Self
参数没有任何用途,因此它永远不会被传递。因此,记录上的所有类方法都必须是静态的
类运算符隐式地是一个静态方法,因此不需要声明它。换句话说,
操作符
意味着静态
与您所说的相反,非静态类方法确实有对作为参数传递的类的引用。这是一个名为Self
的隐式参数
对于记录上的类方法而不是类,因为没有继承,所以这个Self
参数没有任何用途,因此它永远不会被传递。因此,记录上的所有类方法都必须是静态的
类运算符隐式地是一个静态方法,因此不需要声明它。换句话说,
操作符
意味着静态
它可能与“记录管理操作符”有关,这是一种类似于FPC的RAII扩展。这是由编译器工程师/语言设计师做出的设计决策:他们可以简单地在两种情况下都隐式使用static关键字,但他们没有。它可能与“记录管理操作符”有关,这是一种类似于FPC的RAII扩展。这是由编译器工程师/语言设计师做出的设计决定:他们本可以在这两种情况下简单地隐式使用static关键字,但他们没有。每次遇到它,我都会非常恼火,因为它没有任何用处。记录类方法上的Self
参数不仅没有任何用处,而且没有任何可能的(合理的)值,不是吗?@Andreas True,当前语言不支持记录的元类,但原则上它可以。记录类方法上的Self
参数不仅没有任何用途,而且实际上没有任何可能的(合理的)值,是吗?@Andreas True,当前语言不支持记录的元类,但原则上它可以。