Pregunta

Recientemente comencé a aprender D versión 1, usando la biblioteca de tango. Decidí escribir una clase pequeña Dout que envuelve tango.io.Stdout, excepto que anula opShl para igualar mejor a C ++ << Salida de estilo. Mi implementación es así:

// 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;
    }
}

Y en Main, hago una llamada simple a Dout.opshl (), como SO.

// main.d
import do.Dout;
import tango.io.Console;

int main(char[][] argv)
{
    Dout << "Hello" << " world!" << Dout.newline;
    Cin.get();
    return 0;
}

Esto funciona, pero después de presionar Enter y salir de Main, se imprime el texto "do.dout.dout". Después de atravesar el código, descubrí que este texto está impreso en las instrucciones de ensamblaje:

00406B5C call __moduleDtor (40626Ch)

En el que se llama el destructor de dout.

Mi pregunta es, ¿por qué se imprime el nombre del módulo al salir de Main y qué puedo hacer para detener este comportamiento?

¿Fue útil?

Solución

La razón "do.dout.dout" está impresa es porque Dout << Dout.newline; Imprime una nueva línea (en el newline llamada de propiedad) e intenta imprimir una cadena legible humana de un Dout objeto (después de pasar a opShl!Dout())

y solo lo ves durante la destrucción porque entonces la salida está enjuagada;)

Deberías haberlo hecho

__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();
    }
}

que está más cerca del estilo C (Dout es un objeto global y no se recrea Cada llamada, Newline es una estructura especial que sonrejó la salida además de agregarle una nueva línea)

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top