覆盖D类中的toString()

Phi*_*tis 3 d class tostring

我试图在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.除了某些库函数(例如formatwriteln)知道调用它以将对象转换为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你想要的.

另外,在示例中命名一个与成员变量相同的局部变量几乎只是在寻找错误,因为在这一点上很容易混淆局部变量和成员变量.