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.