2013-06-28 3 views
2

Я пытаюсь переопределить метод toString внутри класса на языке D.Переопределение toString() в классе D

override string toString() { 
     auto a = to!string(a); 
     auto b = to!string(b); 

     return "%s/%s", a, b; 
    } 

Я затем создать объект с именем Foo внутри основной(), а затем делать:

writeln(foo); 

Полагая а = 1, Ь = 2, я хочу, чтобы получить эту строку буквальным распечатанный:

1/2 

Вместо этого, я только получить последний номер распечатывается

2 

Я предполагаю, что форматирование строк не работает при возврате.

+4

Мне любопытно - почему вы ожидаете, что оператор запятой создаст строку формата? Я не знаю ни одного языка, где это работает. – scry

ответ

10

Ничего себе. Я никогда не видел, чтобы кто-то пытался это сделать. Нет, это не сработает. 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, что вы хотите.

На стороне примечание, обозначающее локальную переменную так же, как и переменную-член, как и в вашем примере, в значительной степени просто запрашивает ошибки, поскольку становится легко путать локальные переменные и переменные-члены в этой точке.

+0

Спасибо, я также понял, что вы можете использовать ~ для конкатенации –

+0

@PhilKurtis Да, но это менее эффективно, если вы строите строку из разных переменных, а не просто объединяете пару строк - особенно если вам нужно преобразовать некоторые из переменных в строки сначала. –