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

相反,我只打印出最后一个数字
   2

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

最佳答案

哇。我从未见过有人尝试过。不,那是行不通的。 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你要的那个。

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

关于class - 在 D 类中覆盖 toString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17372558/

相关文章:

Java toString() 未打印正确的变量

java - 如何设计一个名为过敏的类?

d - D语言中的阶乘

kotlin - 更改为数据类的String格式

d - D语言释放资源

d - 使用 D 字符串混合进行代码重用是一种反模式吗?

java - 使用 Java 的 Integer.toString() 以 26 为基数作为字母

C++矩阵类: overloading assignment operator

c++ - 如何声明包含整数数组的对象

javascript - 滚动到时更改 <li> 的类