четверг, 9 октября 2014 г.

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

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

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.

Комментариев нет:

Отправить комментарий