Delphi中的Ord函数实现

Fed*_*can 7 delphi

纯粹作为家庭练习,旨在更好地理解一些语言基础,我试图重新实现这个Ord功能,但我遇到了一个问题.

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

我无法弄清楚如何声明同一个函数的多个版本.

应该如何在Delphi中编码?

Joo*_*kka 12

我无法弄清楚如何声明同一个函数的多个版本.

它被称为函数重载.每个版本的输入参数必须不同,返回类型无关紧要.例如:

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

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

// etc.
Run Code Online (Sandbox Code Playgroud)

  • 虽然请注意`ord`是一个特殊的魔术函数而不是普通的Pascal函数.为了让这一点回家,请回想一下,在将函数重载添加到语言之前很久就存在`ord`. (4认同)
  • 作为戴维斯评论的旁注:Ord的实现实际上并不是什么,因为它不会产生额外的操作码.它在N.Wirth的原始Pascal描述中被声明回来,只告诉编译器忽略类型不匹配.确实如此:糟糕的例子...... (2认同)
  • 您也可以通过使用'无类型'参数声明函数来支持类型系统:`Ord(const Value):Integer`但运气好,定义一个可以接受未知类型并返回有意义的Integer值的函数. (2认同)

Rob*_*edy 11

Ord不能用Delphi编码.虽然您可以使用overload指令编写具有相同名称的多个函数,但您无法以Ord这种方式编写函数,因为它适用于任意数量的参数类型而无需多个定义.(无论Ord你写了多少重载,我总能想出一个你的函数不会接受的类型,但编译器会这样做.)

它因为编译魔术而以这种方式工作.编译器知道Ord程序中的所有序数类型,因此它会在线执行函数的操作.其他编译器魔术函数包括Length(魔法,因为它接受任意数组类型),Str(魔术,因为它接受宽度和精度修饰符),和ReadLn(魔法,因为它接受任意数量的参数).