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),这将对代码"结构性"产生负面影响.
我正在寻找以最优雅的方式规避它的方法,最好使编译器发出警告级别的消息.
最好的办法是将其声明为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描述的问题.
这就是为什么你不能这样做的原因:
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),那么您可以使用匿名方法,这些方法应该能够满足您的需求; 你需要一个稍微不同的语法.