ヨーキョクデイ

いろいろ雑食

Tango の Stdout とかを改めて見てみた

Print.dStdout.d を見た。厳密でない説明としては、

  1. StdoutPrint クラスのインスタンスである
  2. Print クラスのインスタンスformat()print() など、自分自身を返すメソッドを持つ
  3. それらのメソッドを連鎖させることができる(メソッドチェーン)
  4. クラス定義内で public alias print opCall; されている

という感じ。重要なところだけを見ると、概ねこんな感じの設計らしい。

import std.stdio;

class Print{
    alias print opCall;

    Print newline(){
        write("\n");
        return this;
    }
    Print print(int n){
        write(n);
        return this;
    }
}

void main(){
    Print Stdout = new Print();

    Stdout.print(1).print(2).print(3).print(4).newline();  // 明示的なメソッドチェーン
    // ↓引数なしメソッドは括弧なしで呼び出せる
    Stdout.print(1).print(2).print(3).print(4).newline;
    // ↓opCall は print のエイリアス
    Stdout.opCall(1).opCall(2).opCall(3).opCall(4).newline;
    // ↓hoge.opCall(...) は結局のところ hoge(...)
    Stdout(1)(2)(3)(4).newline;  // キモいショートハンド誕生
}

結局、括弧が連なってキモいという人は、print() を使えばいいじゃないということですか。

import tango.io.Stdout;

void main(){
    Stdout("3+5")('=')(3+5).newline;

    Stdout.print("3+5").print('=').print(3+5).newline();
    // あるいは
    Stdout.print("3+5").print('=').print(3+5).newline;
}