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

Другие вопросы по тегам