我正在尝试在D语言中覆盖类中的toString方法。
override string toString() {
auto a = to!string(a);
auto b = to!string(b);
return "%s / %s", a, b;
}
然后我在main()中创建了一个名为foo的对象,然后执行:
writeln(foo);
假设a = 1且b = 2,我想打印出这个字符串文字:
1 / 2
相反,我只打印出最后一个号码
2
我假设字符串格式化在返回时不会以这种方式工作。
答案 0 :(得分:11)
哇。我从未见过有人试过这个。不,那不行。 toString
与返回string
的任何其他函数一样。除了一些库函数(例如format
和writeln
)知道调用它以将对象转换为string
之外,没有什么特别之处。所以,如果你做了
string convToString(Foo foo)
{
auto a = to!string(foo.a);
auto b = to!string(foo.b);
return "%s / %s", a, b;
}
然后做了
writeln(convToString(foo));
但是你在这里咬的是逗号运算符。当它运行时,
return "%s / %s", a, b;
将成为
return "%s / %s", "1", "2";
并且逗号运算符的结果是它的最后一个参数,因此返回"2"
。由于"%s / %s"
和"1"
没有副作用,因此它们几乎毫无意义。那时,你可能刚刚写了
return b;
而不是
return "%s / %s", a, b;
您想要做的是使用std.string.format
。并将toString
功能更改为
override string toString()
{
return format("%s / %s", a, b);
}
format
然后会创建您想要的string
。
另外,在示例中命名一个与成员变量相同的局部变量几乎只是要求bug,因为在那一点上很容易混淆局部变量和成员变量。 / p>