D Имя модуля печатается деструктором модуля
Я недавно начал изучать D версию 1, используя библиотеку Tango. Я решил написать небольшой класс Dout
это обертывания tango.io.Stdout
за исключением того, что переопределяет opShl
лучше соответствовать C++ <<
стиль вывода. Моя реализация выглядит так:
// dout.d
module do.Dout;
import tango.io.Stdout;
class Dout
{
public static Dout opShl(T) (T arg)
{
stdout(arg);
return new Dout;
}
public static Dout newline()
{
stdout.newline;
return new Dout;
}
}
И в основном, я делаю простой вызов Dout.opShl(), вот так.
// main.d
import do.Dout;
import tango.io.Console;
int main(char[][] argv)
{
Dout << "Hello" << " world!" << Dout.newline;
Cin.get();
return 0;
}
Это работает, но после нажатия кнопки ввода и выхода из основного, текст "do.Dout.Dout" печатается. Пройдя по коду, я обнаружил, что этот текст напечатан в инструкции по сборке:
00406B5C call __moduleDtor (40626Ch)
В котором вызывается деструктор do.Dout.
У меня вопрос, почему имя модуля печатается при выходе из main, и что я могу сделать, чтобы остановить это поведение?
1 ответ
Причина "do.Dout.Dout" печатается потому что Dout << Dout.newline;
печатает новую строку (в newline
вызов свойства), а затем пытается напечатать читаемую человеком строку Dout
объект (после того, как он передан opShl!Dout()
)
и вы видите это только во время уничтожения, потому что тогда вывод сбрасывается;)
ты должен был сделать
__gshared Doutclass Dout = new Doutclass;
class Doutclass
{
public Dout opShl(T) (T arg)
{
static if(T == NLine){
stdout.newline;//if nl is passed do newline
}else{
stdout(arg);
}
return this;
}
struct NLine{}//this might need a dummy field to stop compiler complaints
public static NLine newline()
{
return NLine();
}
}
который ближе к стилю C (Dout является глобальным объектом и не воссоздается заново при каждом вызове, newline - это специальная структура, которая очищает вывод помимо добавления новой строки к нему)