我想定义一个数组类型,它由不同的类型组成,比如String
,Integer
,Boolean
,Double
等,但是没有对象,结构,或者任何类似的东西。然后我想用这个类型作为函数参数,比如...
type
TMyArray = array of ...?...;
function GetSomething(const Input: TMyArray): String;
var
X: Integer;
begin
for X:= 0 to Length(Input) - 1 do begin
//Identify type and handle accordingly...
//Serialize data for the result...
end;
end;
用它来...
Variable:= GetSomething(['some string', 123, 'something else', 12.3, false]);
那么,在遍历这样的数组时,如何识别每个元素的类型呢?
我很确定这是可能的,但是我甚至不知道要搜索什么术语。我该怎么做?
我必须把它定义为一个变量数组吗?或者有没有一种方法可以精确地定义数组接受哪些类型?
编辑
不是要改变任何问题,但由RRUZ的答案后,我发现an intriguing article的性能时,做这件事不同的方式...
6条答案
按热度按时间6ie5vjzr1#
如果您的 Delphi 版本支持RTTI,则可以使用
TValue
数组和Kind
属性,如下所示。另一个选项是使用
array of const
odopli942#
奇怪的是,至今还没有人提到变体记录,这是Pascal几十年来的一个特点:
pkmbmrz73#
阵列是同构的。如文档所述:
数组表示同一类型(称为基类型)的元素的索引集合。
因此,您只能通过一个可以保存不同类型数据的基类型来实现您的目标。这种数据类型称为variant data type。
在 Delphi 中,有很多可能的变体数据类型。有古老的COM
Variant
类型。有块上的新kid,TValue
,它是为了支持新风格的RTTI而添加的。还有很多第三方选项。通常这些第三方选项的存在是为了支持持久性框架。pu82cl6c4#
由于是作为参数使用的,因此可以使用
array of const
构造。也称为 variant open array parameters. More on my answer on this other question。它的工作原理就像你想要的不同类型的数组一样。
5rgfhyps5#
这真的很简单,而且 Delphi 的版本之间没有什么不同
首先,您需要一个名称和类型的记录,如下所示:
现在数组的不同之处如下所示:
现在你有一个不同类型的数组。
mgdq6dx16#
假设最后你想把数组的输出作为一个字符串(用过程GetSomething),我想你可以用
Variants
很容易地做到这一点。定义数组,如下所示:
现在的GetSomething
procedure
非常简单:而结果也是意料之中的。
这一行:
返回此结果:
一些字符串|一百二十三|别东西|12.3秒|错误|