Class 重写D类中的toString()

Class 重写D类中的toString(),class,d,tostring,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 相反,我只打印

我试图在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 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;
你要做的是使用。并将
toString
功能更改为

override string toString()
{
    return format("%s / %s", a, b);
}
format
随后将创建所需的
字符串


另一方面,将局部变量命名为与您在示例中所做的相同的成员变量几乎只是在询问错误,因为在这一点上很容易混淆局部变量和成员变量。

我很好奇-为什么您希望逗号运算符创建格式字符串?我不知道有哪种语言可以用。谢谢,我还发现你可以用~concatenate@PhilKurtis是的,但是如果您是从各种不同的变量构建一个字符串,而不是仅仅组合两个字符串,那么效率会降低,特别是如果您必须首先将一些变量转换为字符串。