Наверное для тех кто постоянно использует замыкания не будет новостью. Но вот осознал, что может существовать только одно замыкания для какого то конкретного контекста. То есть, анонимных функций может быть несколько, но анонимный класс для контекста создается один.
В этом легко убедиться:
В этом легко убедиться:
program closuretest; {$APPTYPE CONSOLE} {$R *.res} uses System.SysUtils; procedure Test; var i: Integer; m: string; proc, proc2: TProc; function GetClosure1:TProc; begin Result := proc; end; function GetClosure2:TProc; begin Result := proc2; end; var intf1, intf2: IInterface; begin i := 0; proc := procedure() begin inc(i,2); Writeln(i); end; proc2 := procedure() begin inc(i,3); Writeln(i); end; proc(); proc2(); GetClosure1.QueryInterface(IInterface, intf1); GetClosure2.QueryInterface(IInterface, intf2); Writeln(GetClosure1 = GetClosure2); //False Writeln(intf1 = intf2); // TRUE, что и требовалось доказать Read(m); end; begin try Test; except on E: Exception do Writeln(E.ClassName, ': ', E.Message); end; end.
Комментариев нет:
Отправить комментарий