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