Print.d と Stdout.d を見た。厳密でない説明としては、
Stdout
はPrint
クラスのインスタンスであるPrint
クラスのインスタンスはformat()
やprint()
など、自分自身を返すメソッドを持つ- それらのメソッドを連鎖させることができる(メソッドチェーン)
- クラス定義内で
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; }