D Nombre del módulo que se imprime por el destructor del módulo
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?
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)