3

在我正在查看的 Delphi 代码中,我发现了以下几行:

const
    function1: function(const S: String): String = SomeVariable1;
    function2: function(const S: String): String = SomeVariable2;

这是在做什么?我的意思是,不是函数中的实际代码,而是在 const 部分中声明一个函数并将其与变量值进行比较(?)它做了什么?我假设单个等于是一个比较,因为这就是德尔福其他地方的情况。

谢谢你。

4

2 回答 2

18

不,equals 是一个赋值,因为这是常量的赋值方式。例如,考虑

const Pi = 3.1415;

或者

const s = 'This is an example';

还有“类型常量”:

const Pi: extended = 3.1415;

在上面的代码段中,我们定义了一个类型化的常量,它包含一个函数 signature function(const S: String): String。我们为它分配(兼容的)功能SomeVariable1

SomVariable1必须在代码的前面定义,例如,

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

考虑以下示例:

function SomeVariable1(const S: String): String;
begin
  result := S + '!';
end;

const
  function1: function(const S: String): String = SomeVariable1;

procedure TForm1.FormCreate(Sender: TObject);
begin
  caption := function1('test');
end;
于 2011-04-07T15:34:59.963 回答
8

安德烈亚斯的回答很好地涵盖了技术方面,但我想为这部分提供一个答案:

这是在做什么?

更多类似的Why use this weired-looking construct?我可以想到两个原因:

  • 代码是用{$J+}(可分配的类型常量)编写的,并且“常量”在某些时候被分配了不同的值。如果function1被声明为变量,则需要在initialization单元的部分中进行初始化,这可能为时已晚(如果其他单元的initialization部分在此之前运行并尝试调用function1“函数”)
  • 如果函数名称从 更改function1SomeVariable1并且存在无法轻易更改的第 3 方代码时使用。这提供了一种声明别名的单行方式。
于 2011-04-07T16:02:31.603 回答