delphi – 匿名方法 – 变量捕获与值捕获

前端之家收集整理的这篇文章主要介绍了delphi – 匿名方法 – 变量捕获与值捕获前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
下面是基于第1部分的匿名方法部分中的示例的SSCCE
Chris Rolliston出色的Delphi XE2基础书,关于变量的概念
捕获(其中的任何错误完全取决于我).

它完全符合我的预期,在连续点击时记录666,667,668,669
BtnInvoke按钮.特别是它很好地说明了捕获的版本
局部变量我在btnSetUpClick退出后持续很长时间.

到现在为止还挺好.我问的问题不是这个代码本身,而是
Allen Bauer的博客在这里说了些什么:

http://blogs.embarcadero.com/abauer/2008/10/15/38876

现在,我知道最好不要和老板争辩,所以我相信我错过了这一点
他在变量捕获和值捕获之间的区别.以我简单的方式
看看它,我的基于CR的例子通过捕获I作为变量来捕获I的值.

所以,我的问题是,鲍尔先生试图绘制的区别是什么?

(顺便说一句,尽管每天都在观看德尔福部分的SO 9个月,但我还是不完全
如果这个q是主题,请清楚.如果没有,我道歉,我会把它取下来.)

type
  TAnonProc = reference to procedure;

var
  P1,P2 : TAnonProc;

procedure TForm2.Log(Msg : String);
begin
  Memo1.Lines.Add(Msg);
end;

procedure TForm2.btnSetUpClick(Sender: TObject);
var
  I : Integer;
begin
  I := 41;
  P1 := procedure
    begin
      Inc(I);
      Log(IntToStr(I));
    end;

  I := 665;
  P2 := procedure
    begin
      Inc(I);
      Log(IntToStr(I));
    end;
end;

procedure TForm2.btnInvokeClick(Sender: TObject);
begin
  Assert(Assigned(P1));
  Assert(Assigned(P2));

  P1;
  P2;
end;

解决方法

变量捕获与值捕获非常简单.让我们假设两个匿名方法捕获相同的变量.喜欢这个:
Type
  TMyProc = reference to procedure;
var
  i: Integer;
  P1,P2: TMyProc;
....
i := 0;
P1 := procedure begin Writeln(i); inc(i); end;
P2 := procedure begin Writeln(i); inc(i); end;
P1();
P2();
Writeln(i);

两种方法都捕获一个变量.输出是:

0
1
2

这是一个变量的捕获.如果捕获的值不是,那么可以想象这两个方法将具有以值0开始的单独变量.两个函数都可能输出0.

在您的示例中,您应该想象P1捕获值41,而P2捕获值665.但这不会发生.只有一个变量.它在声明它的过程和捕获它的匿名方法之间共享.只要分享它的所有各方都活着,它就会存在.所有其他人都可以看到由一方对变量进行的修改,因为只有一个变量.

因此,无法捕获值.要获得您需要将值复制到新变量并捕获该新变量的行为.例如,可以使用参数来完成.

function CaptureCopy(Value: Integer): TMyProc;
begin
  Result := procedure begin Writeln(Value); end;
end;

...
P3 := CaptureCopy(i);

这会将i的值复制到一个新变量,过程参数,并捕获它.对i的后续更改对P3没有影响,因为捕获的变量是P3的本地变量.

猜你在找的Delphi相关文章