正常松开"分配给过程变量的本地过程/功能"限制

Fre*_*ing 8 delphi procedural scope

考虑以下测试用例:

{ CompilerVersion = 21 }
procedure Global();

  procedure Local();
  begin
  end;

type
  TProcedure = procedure ();
var
  Proc: TProcedure;
begin
  Proc := Local;  { E2094 Local procedure/function 'Local' assigned to procedure variable }
end;
Run Code Online (Sandbox Code Playgroud)

在第13行,编译器发出具有ERROR级别的消息,禁止所有这种本地过程使用的情况."官方"决议是将Local符号推广到外部范围(即:使其成为兄弟姐妹Global),这将对代码"结构性"产生负面影响.


我正在寻找以最优雅的方式规避它的方法,最好使编译器发出警告级别的消息.

Dav*_*nan 8

最好的办法是将其声明为reference to procedure使用新的匿名方法功能,然后您可以保持所有内容的良好封装.

type
  TProc = reference to procedure;

procedure Outer;
var
  Local: TProc;
begin
  Local := procedure
    begin
      DoStuff;
    end;
  Local;
end;
Run Code Online (Sandbox Code Playgroud)

这通过捕获匿名函数本地的任何变量来解决Mason描述的问题.

  • @Jeroen:你的意思是D2009及以上,不是吗?(虽然如果有更新版本,我不建议使用2009年.) (2认同)

Mas*_*ler 5

这就是为什么你不能这样做的原因:

type
  TProcedure = procedure ();

function Global(): TProcedure;
var
  localint: integer;

  procedure Local();
  begin
    localint := localint + 5;
  end;

begin
  result := Local;
end;
Run Code Online (Sandbox Code Playgroud)

本地过程可以访问外部例程的变量范围.但是,这些变量在堆栈上声明,并且在外部过程返回后变为无效.

但是,如果您正在使用CompilerVersion 21(Delphi 2010),那么您可以使用匿名方法,这些方法应该能够满足您的需求; 你需要一个稍微不同的语法.

  • @Worm:是的,差不多,除了你每次程序运行时只得到其中一个而不是新的.:) (2认同)