覆盖D类中的toString()

时间:2013-06-28 19:48:37

标签: class d tostring

我正在尝试在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

我假设字符串格式化在返回时不会以这种方式工作。

1 个答案:

答案 0 :(得分:11)

哇。我从未见过有人试过这个。不,那不行。 toString与返回string的任何其他函数一样。除了一些库函数(例如formatwriteln)知道调用它以将对象转换为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>