2014-07-12 94 views
2

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

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

请您澄清一下问题。你的代码工作得很好。这是一旦你修复语法错误 –

+0

我假设他或她想要为TArray ,IOW中的任何类型的T做这个,他想要一个'class procedure Print (const A:TArray ; const Name:串);'。我假设他不知道如何写'写(A [I]);'部分如果'A [I]'是通用的。 –

+0

@RudyVelthuis正是!字符串等 – user3764855

回答

6

WriteWriteln程序不能通用的参数来调用。因此,明显的结论是,在调用WriteWriteln之前,您需要将通用值转换为字符串。

这可以通过采取下列功能的优势使用TValue来实现:

  1. 通用TValue.From<T>方法,使一个新的TValue实例。
  2. 将最常见类型转换为字符串的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] 

顺便它真的惹恼了我,我要创建一个类来保存这些方法。我不明白为什么语言设计师会做出这个决定。

+0

啊!好的旧'ToString'。 – user3764855

+0

哎呀,我完全忘了'TValue.ToString'。 –

+0

FWIW,'TStringHelper'有一个'Join(Separator,Values)'方法,可以使循环更简单一些。不过,它确实需要你首先生成一个“字符串数组”。 –