Wim*_*ink 5 delphi anonymous-types delphi-10.4-sydney
在阅读Delphi中匿名方法的文档时,我开始怀疑。我一直使用这样的东西:
type TMathFn = Function(A, B: Integer): Integer;
var fn: TMathFn;
Run Code Online (Sandbox Code Playgroud)
一直为我工作。但是这个文件告诉我改用这个:
type TMathFn = Reference to Function(A, B: Integer): Integer;
var fn: TMathFn;
Run Code Online (Sandbox Code Playgroud)
因为我从 1994 年到 2010 年一直在 Delphi 中进行开发,所以我对这个“参考”部分有点陌生。尽管如此,这两个选项似乎工作相同。所以……
它们是一样的吗?
“REFERENCE TO”是允许匿名方法(PROCEDUREs/FUNCTIONs的内联定义),它可以捕获上下文(例如局部变量,被捕获为引用,即如果在捕获后更改变量,则是修改后的值被捕获,见下文)。
TYPE TMyProc = REFERENCE TO PROCEDURE(CONST S : STRING);
PROCEDURE Information(CONST S : STRING);
BEGIN
MessageDlg(S,mtInformation,[mbOK],0)
END;
PROCEDURE RunProc(P : TMyProc ; CONST S : STRING);
BEGIN
P(S)
END;
PROCEDURE A(B,C : INTEGER);
VAR
D : INTEGER;
P : TMyProc;
BEGIN
D:=3;
// D is 3 at the time of capture
P:=PROCEDURE(CONST S : STRING)
BEGIN
Information(S+': '+IntToStr(D)+' -> '+IntToStr(B))
END;
// D is now 4 - and is reflected in the captured routine, as
// the capture is done by REFERENCE and not by VALUE.
INC(D);
RunProc(P,'Hello')
END;
BEGIN
A(2,3)
END.
Run Code Online (Sandbox Code Playgroud)
将在消息框中显示“Hello: 4 -> 2”。
P 的上述定义“捕获”(包括)变量 D 和 B,因此即使您将其传递给另一个函数,但这些变量不存在,您仍然可以访问它们。
这对于普通的 PROCEDURE [OF OBJECT] 类型(几乎)是不可能的,因为它们无法访问在执行点声明的局部变量。
不,它们并不相同。
不同之处在于
TMathFn = function(A, B: Integer): Integer;
Run Code Online (Sandbox Code Playgroud)
是一个普通的函数,
TMathMethod = function(A, B: Integer): Integer of object;
Run Code Online (Sandbox Code Playgroud)
是一种方法,并且
TMathAnonMethod = reference to function(A, B: Integer): Integer;
Run Code Online (Sandbox Code Playgroud)
是匿名方法,但您也可以将普通函数或方法分配给这种类型的变量。
所以,例如,如果
TMathFn = function(A, B: Integer): Integer;
Run Code Online (Sandbox Code Playgroud)
那么以下适用:
TMathMethod = function(A, B: Integer): Integer of object;
Run Code Online (Sandbox Code Playgroud)
正如您可能已经知道的那样,F在幕后,它只是一个(函数)指针,并且M是一个方法指针。另一方面,匿名方法有一个更复杂的基于接口的实现,它允许他们所有的魔法(如变量捕获)。