개방형 문자열 배열의 내용을 익명 함수로 전달할 때 열려있는 배열을 기대하는 다른 함수로 전달하는 데 낭비되는 최소한의 방법은 무엇입니까?오픈 어레이를 익명 함수로 전달
오픈 어레이는 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'을 캡처 할 수 없습니다"
이
는 문제를 보여줍니다.명백한 해결책은 동적 배열에 aString 복사본을 만들고 캡처하는 것입니다. 하지만 나는 복사본을 만들고 싶지 않습니다. (내 특정 문제는 문자열 배열을 포함하고 복사본을 만드는 것은 참조 횟수로 인해 문자열 데이터 자체가 아닌 포인터 만 복사하는 것이므로 임의로 큰 비평가 배열에 대한 문제를 해결하는 방법을 배우는 것도 도움이 될 것입니다
그래서 나는 PString
aStrings의 첫 번째 문자열 포인터와 길이의 Integer
값을 캡처하려고했습니다. 그러나 나는 이것을 InsertText
에게 넘겨 줄 방법을 찾지 못했습니다.
다른 하나의 제약 : DoSomething([a, b, c])
으로 전화를 걸 수 있습니다.
IndexText
의 내 자신의 버전을 작성하지 않고, 그리고 끔찍한 못생긴하지 않고 배열의 복사본을 만들지 않고이를 수행 할 수있는 방법이 있습니까? 그렇다면 어떻게?
나는이 질문을 위해서 IndexText
을 사용했지만 개방형 배열 대신 포인터와 길이 매개 변수를 받아들이도록 쉽게 작성할 수없는 함수에 대한 해결책을 찾는 것이 좋습니다.
이 질문에 대한 대답은 다음과 같습니다. 아니, 적어도 복사하지 않고 (다시 작성하거나 IndexText
을 다시 작성하지 않아도) 그렇게 할 수는 없지만 그렇게하는 것이 가장 기본적인 이유를 알고 싶습니다.
예, 전화 한건'해봐요 ([A, B, C]) ':-( –
@IanGoldby은 : 다음 동적'TArrayNoInit이'를 생성하고 전달 XE7에서 함께 수행 될 수있다. : myArray : = TArray .Create (a, b, c);'를 사용하여 수행 할 수 있지만 매우 효과적이지는 않습니다 .하지만 OTOH, 오픈 배열 매개 변수 생성자 중 하나는 매우 잘 수행되지 않습니다. 복사를 피하기 위해 매개 변수가'const'인지 확인하십시오. –