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?

È stato utile?

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)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top