2

最近、Tango ライブラリを使用して D バージョン 1 の学習を開始しました。C++ のスタイル出力によりよく一致するようにオーバーライドすることを除いてDout、ラップする小さなクラスを作成することにしました。私の実装は次のようになります。tango.io.StdoutopShl<<

// 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;
    }
}

そして主に、Dout.opShl() への単純な呼び出しを行います。

// main.d
import do.Dout;
import tango.io.Console;

int main(char[][] argv)
{
    Dout << "Hello" << " world!" << Dout.newline;
    Cin.get();
    return 0;
}

これは機能しますが、Enter キーを押してメインを終了すると、テキスト「do.Dout.Dout」が出力されます。コードをステップ実行した後、次のテキストがアセンブリ命令で印刷されていることがわかりました。

00406B5C call __moduleDtor (40626Ch)

do.Dout のデストラクタが呼び出されています。

私の質問は、メインの終了時にモジュール名が出力されるのはなぜですか?この動作を停止するにはどうすればよいですか?

4

1 に答える 1

3

「do.Dout.Dout」がDout << Dout.newline;出力される理由は、(プロパティ呼び出しで) 新しい行を出力してnewlineから、人間が読み取れるオブジェクトの文字列を出力しようとするためDoutです (それが に渡された後opShl!Dout()) 。

出力がフラッシュされるため、破棄中にのみ表示されます;)

あなたがすべきだった

__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();
    }
}

これは C スタイルに近いです (Dout はグローバル オブジェクトであり、呼び出しごとに再作成されません。改行は、改行を追加する以外に出力をフラッシュする特別な構造体です)

于 2012-01-12T21:58:38.420 に答える