我正在尝试覆盖 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
我假设字符串格式在返回时不会以这种方式工作。
最佳答案
哇。我从未见过有人尝试过。不,那是行不通的。 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
你要的那个。附带说明一下,像您在示例中所做的那样将局部变量命名为与成员变量相同的名称几乎只是在寻找错误,因为此时很容易混淆局部变量和成员变量。
关于class - 在 D 类中覆盖 toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372558/