D Nome del modulo stampato da Modulo Destructor
Domanda
Di recente ho iniziato a imparare la versione 1, usando la libreria Tango. Ho deciso di scrivere una piccola classe Dout
che avvolge tango.io.Stdout
, Tranne che si prevale opShl
per abbinare meglio i C ++ <<
output di stile. La mia implementazione è così:
// 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;
}
}
E in main, faccio una semplice chiamata a dout.opshl (), così.
// main.d
import do.Dout;
import tango.io.Console;
int main(char[][] argv)
{
Dout << "Hello" << " world!" << Dout.newline;
Cin.get();
return 0;
}
Funziona, ma dopo aver premuto INVIO e uscito da Main, viene stampato il testo "Do.Dout.Dout". Dopo aver attraversato il codice, ho scoperto che questo testo è stampato sull'istruzione di assemblaggio:
00406B5C call __moduleDtor (40626Ch)
In cui viene chiamato il distruttore di Dout.
La mia domanda è: perché il nome del modulo viene stampato all'uscita principale e cosa posso fare per fermare questo comportamento?
Soluzione
Il motivo per cui "do.dout.dout" è stampato perché Dout << Dout.newline;
Stampa una nuova linea (in newline
Chiamata di proprietà) e quindi tenta di stampare una stringa umana leggibile di a Dout
oggetto (dopo che è passato a opShl!Dout()
)
e lo vedi solo durante la distruzione perché allora l'output è scaricato;)
Avresti dovuto fare
__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();
}
}
che è più vicino allo stile C (Dout è un oggetto globale e non viene ricreato Ogni chiamata, Newline è una struttura speciale che ha scaricato l'output oltre ad aggiungere una nuova linea)