如何将通用数组打印到控制台?这适用于简单的整数数组,但不适用于通用数组。

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;

最佳答案

WriteWriteln过程不能使用通用参数调用。因此,显而易见的结论是,需要在调用WriteWriteln之前将泛型值转换为字符串。

可以使用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.


输出量

数组整数:[1、2、3、4]
数组浮点数:[42.666,123.4]
数组字符串:[foo,bar]




顺便说一句,我不得不创建一个类来容纳这些方法确实让我很烦。我不明白为什么语言设计师会做出这个决定。

关于delphi - 将通用数组打印到控制台,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24714842/

10-12 00:20
查看更多