Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top