Delphi 将开放数组传递到匿名函数

Delphi 将开放数组传递到匿名函数,delphi,delphi-xe2,anonymous-methods,Delphi,Delphi Xe2,Anonymous Methods,将开放字符串数组的内容传递到匿名函数并从匿名函数传递到另一个需要开放数组的函数中,哪种方式最不浪费(即尽可能避免复制) 问题是Delphi XE2中的匿名函数无法捕获开放数组 这说明了问题: procedure TMyClass.DoSomething(const aStrings: array of string); begin EnumItems( function (aItem: string) : Boolean begin Result := Index

将开放字符串数组的内容传递到匿名函数并从匿名函数传递到另一个需要开放数组的函数中,哪种方式最不浪费(即尽可能避免复制)

问题是Delphi XE2中的匿名函数无法捕获开放数组

这说明了问题:

procedure TMyClass.DoSomething(const aStrings: array of string);
begin
  EnumItems(
    function (aItem: string) : Boolean
    begin
      Result := IndexText(aItem, aStrings) >= 0;
    end);
end;
编译器抱怨:“无法捕获符号‘aStrings’”

一个显而易见的解决方案是在动态数组中复制aStrings并捕获它。但我不想复制。(虽然我的具体问题涉及一个字符串数组,但由于引用计数,复制只会复制指针,而不会复制字符串数据本身,但了解如何解决非引用计数类型的任意大数组的问题也很有帮助。)

因此,我尝试捕获一个指向aStrings中第一个字符串的
PString
指针和长度的
Integer
值。但是我想不出一种方法来将这些信息传递给
InsertText

另一个约束:我希望它能够调用
DoSomething([a,b,c])

有没有一种方法可以做到这一点,而无需复制数组,无需编写自己版本的
IndexText
,也无需非常丑陋?如果是,怎么做

为了解决这个问题,我使用了
IndexText
,但是对于一个不能简单地重写为接受指针和长度参数而不是开放数组的函数,找到一个解决方案会很有帮助


这个问题的一个可接受的答案是:不,你不能这样做(至少不能不复制或重写
IndexText
),但如果是这样,我也想知道为什么不这样做的根本原因。

如果你不想复制数组,那么你应该将剂量测量的签名改为使用
TArray
。当然,如果您直接传递元素(只有在XE7之后,您才能以相同的方式传递动态数组),您必须更改调用方端,比如
DoSomething([a,b,c])


我的建议是不要乱搞一些内部指针之类的东西,尤其是对于开放数组。

如果不复制,就无法做到这一点。无法像您发现的那样捕获打开的数组,并且在没有捕获的情况下无法将信息获取到匿名方法中。通常,您必须捕获,因为您需要延长变量的生命周期

因此,您无法使用打开的数组来执行此操作并避免复制。你可以改为:

  • 从开放阵列切换到动态阵列,
    TArray
  • 制作数组的副本。您不会复制字符串数据,而只是复制字符串的引用数组
    是的,我正在调用
    DoSomething([a,b,c])
    :-(@IanGoldby:然后创建一个动态
    TArray
    ,并传递它。在XE7中,可以使用:
    myArray:=[a,b,c];
    ,否则可以使用创建语法:
    myArray:=TArray.create(a,b,c);
    ,但请注意,这不是很好的性能。但是,开放数组参数构造函数也不是很好的性能。请确保参数是
    常量,以避免任何复制。您可以捕获指向数组第一个元素的指针(而不是复制),但是你不再有一个开放数组可以传递给
    indextextext
    。这是我认为可能有解决方案的第二部分。听起来好像你在说没有。anon方法可能超出了开放数组的范围。那么你的指针无效。这就是我想说的。好的,我知道生命周期问题(以及为什么编译器不会捕获开放数组参数)。我只关心anon方法不会在数组中生存的特定情况,并想知道是否有语法可以使指针和长度参数看起来像
    IndexText
    的开放数组(或类似的“技巧”)。你可以随意破解,但这不值得。使用
    TArray
    。谢谢。如果没有简单的解决方案,那么任何破解都会难看得无法忍受。我决定接受Stefan的回答,因为它提到了XE7,并附上了Rudy的有用评论。