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?

Était-ce utile?

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)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top