gpt4 book ai didi

arrays - 数组类型可以有方法吗?

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

我定义了一个动态数组类型,如下所示:

TMyIntegerArray = array of integer:

我想使用 IndexOf 函数,就像它是 TObject 的后代一样:

var
MyArray : TMyIntegerArray;
i : integer:
begin
//...
i := MyArray.IndexOf(10);
//...
end;

目前,我找到的唯一解决方案是编写一个接受数组和目标值作为参数的函数:

function IndexOf(AArray : TMyIntegerArray; ATargetValue : integer; AOffset : integer = 0);
begin
Result := AOffset;
while(Result < Length(AArray)) do
begin
if(AArray[Result] = ATargetValue)
then Exit;
Result := Result + 1;
end;
Result := -1;
end;

TMyIntegerArray类型可以有像IndexOf这样的函数吗?

更多信息:

目前,我使用的是 Delphi2007,但我也有兴趣知道是否有任何方法可以在较新的 Delphi 版本中向数组类型添加方法。

最佳答案

在较新版本的 Delphi (XE3+) 中,可以使用 record helpers 实现数组类型的方法。 :

program ProjectTest;

{$APPTYPE CONSOLE}

Type
TMyArray = array of integer;

TMyArrayHelper = record helper for TMyArray
procedure Print;
function IndexOf(ATargetValue : integer; AOffset : integer = 0): Integer;
end;

procedure TMyArrayHelper.Print;
var
i: Integer;
begin
for i in Self do WriteLn(i); // Use Self for variable reference
end;

function TMyArrayHelper.IndexOf(ATargetValue : integer; AOffset : integer = 0): Integer;
begin
Result := AOffset;
while(Result < Length(Self)) do
begin
if(Self[Result] = ATargetValue)
then Exit;
Result := Result + 1;
end;
Result := -1;
end;

var
myArr : TMyArray;
begin
myArr := [0,1,2]; // A neat way to populate a dynamic array (XE7+)
myArr.Print;
WriteLn(myArr.IndexOf(2));

ReadLn;
end.
<小时/>

注意:您可以跳过 TMyArray类型声明和使用 TArray<Integer>以获得更轻松的类型解析。与记录助手一样,只能有一个助手附加到一种类型(并且将使用的助手是范围内最接近的助手)。

这种类型的助手称为 intrinsic type helper ,编译器在类型周围放置一个隐式记录结构。

关于arrays - 数组类型可以有方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42767205/

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