Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.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/6/haskell/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
Ord函数在Delphi中的实现_Delphi - Fatal编程技术网

Ord函数在Delphi中的实现

Ord函数在Delphi中的实现,delphi,Delphi,纯粹是在家里练习,目的是更好地理解一些语言基础知识,我试图重新实现Ord函数,但遇到了一个问题 事实上,现有的Ord函数可以接受各种不同类型的参数(AnsiChar,Char,WideChar,Enumeration,Integer,Int64),并可以返回Integer或Int64 我不知道如何声明同一函数的多个版本 这应该如何在Delphi中编码 我不知道如何声明同一函数的多个版本 它叫。每个版本的输入参数必须不同,返回类型无关紧要。例如: function Ord(X: Char): In

纯粹是在家里练习,目的是更好地理解一些语言基础知识,我试图重新实现
Ord
函数,但遇到了一个问题

事实上,现有的
Ord
函数可以接受各种不同类型的参数(
AnsiChar
Char
WideChar
Enumeration
Integer
Int64
),并可以返回Integer或Int64

我不知道如何声明同一函数的多个版本

这应该如何在Delphi中编码

我不知道如何声明同一函数的多个版本

它叫。每个版本的输入参数必须不同,返回类型无关紧要。例如:

function Ord(X: Char): Integer; overload;
begin
  // Whatever here
end;

function Ord(X: Integer): Integer; overload;
begin
  // Something
end;

// etc.

Ord
不能在Delphi中编码。尽管您可以使用来编写具有相同名称的多个函数,但不能以这种方式编写
Ord
函数,因为它适用于任意数量的参数类型,而不需要多个定义。(无论您编写了多少个
Ord
重载,我总能找到一种类型,您的函数不会接受,但编译器会接受。)


这是因为编译器的魔力。编译器知道程序中的
Ord
和所有序数类型,因此它可以在线执行函数的操作。其他编译器魔法函数包括(魔法,因为它接受任意数组类型),(魔法,因为它接受宽度和精度修饰符)和(魔法,因为它接受任意数量的参数)。

尽管请注意,
ord
是一个特殊的魔法函数,而不是普通的Pascal函数。为了阐明这一点,回想一下,
ord
早在函数重载被添加到语言中之前就存在了。没错,如果为了学习目的而重新实现,最好不要称它为
ord
!作为Davids评论的旁注:Ord的实现实际上什么都不是,因为它不会产生额外的操作码。它是在N.Wirth的原始Pascal描述中声明的,只告诉编译器忽略类型不匹配。因此,确实是一个糟糕的例子……您也可以通过使用“无类型”参数声明函数来避开类型系统:
Ord(const Value):Integer
,但祝您好运,定义一个可以接受未知类型并返回有意义整数值的函数。Uwe是正确的。Ord是一种编译器原语,它将特定的强类型序数值松弛为弱类型序数值,通常是从枚举值或字符文本,这是对标题中提到的问题的正确答案。我不完全相信在当前的Delphi中使用非类型化参数+一些RTTI混乱是不可能的。但就算如此,至少这是非常不切实际的@Joonas,无类型意味着没有类型。无法从没有类型的对象获取类型信息。如果您建议使用泛型,那么可能会有一些希望。