D Nom du module en cours d'impression par module Destructeur
Question
J'ai récemment commencé à apprendre la version D 1, en utilisant la bibliothèque Tango. J'ai décidé d'écrire un petit Dout
de classe qui enveloppe tango.io.Stdout
, sauf qu'il remplace opShl
pour mieux correspondre C ++ de sortie de style <<
de '. Ma mise en œuvre est comme ceci:
// 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;
}
}
Et dans le principal, je fais un simple appel à Dout.opShl (), comme ainsi.
// main.d
import do.Dout;
import tango.io.Console;
int main(char[][] argv)
{
Dout << "Hello" << " world!" << Dout.newline;
Cin.get();
return 0;
}
Cela fonctionne, mais après avoir appuyé sur entrer et sortir principale, le texte « do.Dout.Dout » est imprimé. Après avoir quitté dans le code, je trouve que ce texte est imprimé à l'instruction de montage:
00406B5C call __moduleDtor (40626Ch)
Dans lequel la destructor de do.Dout est appelé.
Ma question est, pourquoi le nom du module en cours d'impression à la sortie principale, et que puis-je faire pour arrêter ce comportement?
La solution
la raison « do.Dout.Dout » est imprimé parce que Dout << Dout.newline;
imprime une nouvelle ligne (dans l'appel de propriété newline
) puis tente d'imprimer une chaîne lisible par l'homme d'un objet Dout
(après il est passé à opShl!Dout()
)
et vous voyez que pendant la destruction, car alors la sortie est rincée;)
vous devriez avoir fait
__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();
}
}
qui est plus proche du style C (Dout est un objet global et ne sont pas recréés chaque appel, saut de ligne est un struct spécial qui rincée la sortie en plus d'ajouter une nouvelle ligne à elle)