当我尝试将对象转换为字符串时,是否有默认方法会被调用? (例如,Java中的toString或Python中的__str__。)我希望能够对一组对象进行以下操作,但其中一些可能为零:

for item in array {
    writeln(item : string);
}

最佳答案

首先,将nil强制转换为字符串不一定是问题:

class C {
  var x:int;
}

var array = [ new C(1), nil:C, new C(2) ];

for item in array {
  writeln( item : string );
}

输出
{x = 1}
nil
{x = 2}

其次,如果您确实想自定义类C的输出,则可以编写一个writeThis方法(或一个readWriteThis方法)。参见The readThis(), writeThis(), and readWriteThis() Methods。对于转换为字符串和普通I / O,都会调用writeThis方法。例如:
class C {
  var x:int;
  proc writeThis(writer) {
    writer.writef("{%010i}", x);
  }
}

var array = [ new C(1), nil:C, new C(2) ];

for item in array {
  writeln( "writing item : string  ", item : string );
  writeln( "writing item           ", item);
}

输出
writing item : string  {0000000001}
writing item           {0000000001}
writing item : string  nil
writing item           nil
writing item : string  {0000000002}
writing item           {0000000002}

关于它为什么会这样工作,将来可能会做些什么以及当前策略的局限性,我还有很多话要说。但是如果您愿意,可以通过邮件列表进行此类讨论它。

09-28 11:21