3

我试图在 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

我假设返回时字符串格式不起作用。

4

1 回答 1

11

哇。我从没见过有人尝试过。不,那是行不通的。toString就像任何其他返回 a 的函数一样string。除了一些库函数(例如formatand 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您想要的。

附带说明一下,将局部变量命名为与示例中的成员变量相同的名称几乎只是在询问错误,因为此时很容易混淆局部变量和成员变量。

于 2013-06-28T21:19:03.927 回答