如何将通用阵列打印到控制台?这适用于简单的整数数组,但不适用于通用数组。
class procedure Print(const A: TArray<Integer>; const Name: String);
var
I: Integer;
begin
Write('Array ' + Name +' : ');
Write('[');
for I := 0 to High(A) do
if I <> High(A) then
begin
WriteLn(A[I]);
Write(', ');
end
else
Write(A[I]);
Write(']');
WriteLn('');
end;
答案 0 :(得分:6)
无法使用泛型参数调用Write
和Writeln
过程。因此,显而易见的结论是,在调用Write
和Writeln
之前,您需要将泛型值转换为字符串。
这可以通过利用以下功能使用TValue
来实现:
TValue.From<T>
实例的通用TValue
方法。TValue.ToString
方法。所以,我认为你正在寻找这样的东西:
{$APPTYPE CONSOLE}
uses
System.Rtti;
type
TMyClass = class
class procedure Write<T>(const arr: array of T; const Name: string); static;
end;
class procedure TMyClass.Write<T>(
const arr: array of T; const Name: string);
var
I: Integer;
begin
System.Write('Array ' + Name +' : [');
for I := 0 to high(arr) do begin
System.Write(TValue.From(arr[i]).ToString);
if I <> high(arr) then begin
System.Write(', ');
end;
end;
System.Writeln(']');
end;
begin
TMyClass.Write<Integer>([1,2,3,4], 'integer');
TMyClass.Write<Double>([42.666, 123.4], 'floating point');
TMyClass.Write<string>(['foo', 'bar'], 'string');
Readln;
end.
<强>输出强>
Array integer : [1, 2, 3, 4] Array floating point : [42.666, 123.4] Array string : [foo, bar]
顺便说一句,我必须创建一个类来保存这些方法。我不明白为什么语言设计师会做出这个决定。