Delphi 循环中的就地匿名函数
In-place anonymous functions in Delphi loop
是否可以转换为:
program RangeLoop;
type
TIndexedProc = reference to procedure(idx: Integer);
var
i: Integer;
p: TIndexedProc;
begin
p := procedure(ix: Integer)
var LocalVar: Integer;
begin
//Do some processing
end;
for i in [2..7] do p(i);
end.
变成这样的东西:
program RangeLoop;
var
i: Integer;
begin
for i in [2..7] do procedure(ix: Integer)
var LocalVar: Boolean;
begin
//Do some processing
end;
end.
?
我知道最后一个代码块无效。
在Delphi 10.3及以后的版本中,你可以在循环中使用一个inline variable来保存匿名过程,例如:
program RangeLoop;
var
i: Integer;
begin
for i in [2..7] do
begin
var p := procedure(ix: Integer)
begin
//Do some processing
var LocalVar := ...;
end;
p(i);
end;
end.
在 10.3 之前,您所要求的根本无法按照您想要的方式实现。在循环之上定义 p
是你最好的选择,除非你使用一个独立的程序,例如:
program RangeLoop;
procedure p(ix: Integer);
var
LocalVar: Integer;
begin
//Do some processing
end;
var
i: Integer;
begin
for i in [2..7] do p(i);
end.
或者,如果您可以改用 TParallel.For()
,如果您的循环迭代是线程安全的并且不依赖于彼此的结果:
program RangeLoop;
uses
System.Threading;
begin
TParallel.For(2, 7, procedure(ix: Integer)
begin
//Do some processing
end;
);
end.
是否可以转换为:
program RangeLoop;
type
TIndexedProc = reference to procedure(idx: Integer);
var
i: Integer;
p: TIndexedProc;
begin
p := procedure(ix: Integer)
var LocalVar: Integer;
begin
//Do some processing
end;
for i in [2..7] do p(i);
end.
变成这样的东西:
program RangeLoop;
var
i: Integer;
begin
for i in [2..7] do procedure(ix: Integer)
var LocalVar: Boolean;
begin
//Do some processing
end;
end.
?
我知道最后一个代码块无效。
在Delphi 10.3及以后的版本中,你可以在循环中使用一个inline variable来保存匿名过程,例如:
program RangeLoop;
var
i: Integer;
begin
for i in [2..7] do
begin
var p := procedure(ix: Integer)
begin
//Do some processing
var LocalVar := ...;
end;
p(i);
end;
end.
在 10.3 之前,您所要求的根本无法按照您想要的方式实现。在循环之上定义 p
是你最好的选择,除非你使用一个独立的程序,例如:
program RangeLoop;
procedure p(ix: Integer);
var
LocalVar: Integer;
begin
//Do some processing
end;
var
i: Integer;
begin
for i in [2..7] do p(i);
end.
或者,如果您可以改用 TParallel.For()
,如果您的循环迭代是线程安全的并且不依赖于彼此的结果:
program RangeLoop;
uses
System.Threading;
begin
TParallel.For(2, 7, procedure(ix: Integer)
begin
//Do some processing
end;
);
end.