Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 为什么在一种情况下需要静态,而在另一种情况下不是强制性的?_Delphi_Pascal_Freepascal - Fatal编程技术网

Delphi 为什么在一种情况下需要静态,而在另一种情况下不是强制性的?

Delphi 为什么在一种情况下需要静态,而在另一种情况下不是强制性的?,delphi,pascal,freepascal,Delphi,Pascal,Freepascal,FreePascal,Delphi模式。经过一些实验,我发现这段代码是编译的,FPC告诉我类过程必须是“静态的”。但我的问题是:那么为什么操作符Equal不需要“静态”,而且编译很好?!我也不明白“class”过程和“class”与“static”有什么区别(例如,在Python中classmethod中,您得到参数-对类的引用,在staticmethod中,您没有这样的参数) 类型TPos=记录 弗林:字; FPos:单词; 类程序初始化(输出a:TPos);静止的 类运算符Equal(a,b

FreePascal,Delphi模式。经过一些实验,我发现这段代码是编译的,FPC告诉我类过程必须是“静态的”。但我的问题是:那么为什么操作符
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,当前语言不支持记录的元类,但原则上它可以。