D Имя модуля распечатывается деструктором модуля - PullRequest
2 голосов
/ 12 января 2012

Я недавно начал изучать 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.

Myвопрос в том, почему имя модуля печатается при выходе из main, и что я могу сделать, чтобы остановить это поведение?

1 Ответ

3 голосов
/ 13 января 2012

причина, по которой выводится 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 - это специальная структура, которая очищает вывод помимо добавления новой строки к нему)

...