【问题标题】:Print generic array to console将通用数组打印到控制台
【发布时间】:2014-07-12 16:13:37
【问题描述】:

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

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;

【问题讨论】:

  • 请你澄清这个问题。你的代码工作得很好。那是一旦你修复了语法错误
  • 我假设他或她想为 TArray 中的任何类型的 T 执行此操作,IOW,(s)他想要一个 class procedure Print&lt;T&gt;(const A: TArray&lt;T&gt;; const Name:string);。如果A[I] 是通用的,我假设他不知道如何处理Write(A[I]); 部分。
  • @RudyVelthuis 没错!字符串等

标签: delphi delphi-xe6


【解决方案1】:

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

这可以通过利用以下功能使用TValue 来实现:

  1. 通用的TValue.From&lt;T&gt; 方法创建一个新的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.

输出

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

顺便说一句,我必须创建一个类来保存这些方法,这让我很恼火。我不明白为什么语言设计者会做出这个决定。

【讨论】:

  • 见鬼,我完全忘记了TValue.ToString
  • @rudy 感谢您的编辑。我从来没有超越字符串助手原始形式的骇人听闻的质量。所有这一切都对堆造成如此沉重的打击,这真是令人恼火。
  • @rudy 我当时提交了很多 QC 报告。我敢肯定他们现在已经修好了。令人震惊的是,他们似乎没有对这种基本类型进行任何适当的测试。令人担忧。
  • @DavidHeffernan 确实令人担忧。 Delphi 太贵了,不能有这些愚蠢的错误。 QC 中心每天都在变得越来越大。
  • 这是您的代码的问题,而不是我的答案的问题。使用TValue.From&lt;T&gt; 而不是TValue.From 修复它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-17
  • 2011-12-03
相关资源
最近更新 更多