Немного про замыкания

Spread the love
Наверное для тех кто постоянно использует замыкания не будет новостью. Но вот осознал, что может существовать только одно замыкания для какого то конкретного контекста. То есть, анонимных функций может быть несколько, но анонимный класс для контекста создается один.
В этом легко убедиться:

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.

Читать на сайте автора.

0 ответы

Ответить

Хотите присоединиться к обсуждению?
Не стесняйтесь вносить свой вклад!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *