2014-07-12 180 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)'方法,可以使循環更簡單一些。不過,它確實需要你首先生成一個「字符串數組」。 –