D Имя модуля печатается Destructor Module
Вопрос
Я недавно начал изучать 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;
}
Это работает, но после нажатия Enter и выхода из Main текст "do.dout.dout" напечатан. После прохождения кода я обнаружил, что этот текст напечатан на инструкции сборки:
00406B5C call __moduleDtor (40626Ch)
В котором называется деструктор Do.dout.
Мой вопрос: почему имя модуля печатается при выходе из Main, и что я могу сделать, чтобы остановить это поведение?
Решение
Причина «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 - это специальная структура, которая промыла вывод, помимо добавления новой линии)