gpt4 book ai didi

delphi - 将开放数组传递给匿名函数

转载 作者:行者123 更新时间:2023-12-03 15:46:18 24 4
gpt4 key购买 nike

将开放字符串数组的内容传递到匿名函数并从那里传递到另一个需要开放数组的函数的最不浪费的方法是什么(即,尽可能避免复制)?

问题在于 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 的副本并捕获它。但我不想复印。 (虽然我的具体问题涉及字符串数组,并且由于引用计数,制作副本只会复制指针而不是字符串数据本身,但学习如何解决任意大的非引用数组的问题也很有启发性计数类型。)

因此,我 try catch 指向 aStrings 中第一个字符串的 PString 指针和长度的 Integer 值。但后来我无法找到将这些传递给 InsertText 的方法。

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

有没有一种方法可以做到这一点,而无需复制数组,无需编写我自己的 IndexText 版本,并且不会变得丑陋不堪?如果是这样,怎么办?

为了这个问题,我使用了 IndexText,但是找到一个无法简单重写以接受指针和长度参数而不是开放数组。

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

最佳答案

如果您不想复制数组,那么您应该更改 DoSomething 的签名以采用 TArray<string>反而。如果您直接传递元素,您当然必须更改调用方(仅从 XE7 开始,您可以以相同的方式传递动态数组) - 例如 DoSomething([a, b, c])我的意思是。

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

关于delphi - 将开放数组传递给匿名函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26863036/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com