Ничего себе. Я никогда не видел, чтобы кто-то пытался это сделать. Нет, это не сработает. toString
походит на любую другую функцию, которая возвращает string
. В этом нет ничего особенного, кроме того, что некоторые функции библиотеки (такие как format
и 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
, что вы хотите.
На стороне примечание, обозначающее локальную переменную так же, как и переменную-член, как и в вашем примере, в значительной степени просто запрашивает ошибки, поскольку становится легко путать локальные переменные и переменные-члены в этой точке.
Мне любопытно - почему вы ожидаете, что оператор запятой создаст строку формата? Я не знаю ни одного языка, где это работает. – scry