デリゲートや関数ポインタを使うようになると, わざわざ独立した関数を書くのが無駄 な場面があることに気がつく (イベントハンドラが典型例. 他にスレッド関数, コールバック関数などがありがち)
そんなとき, 関数リテラルとデリゲートリテラルをコードに直接埋め込むことができる.
literal.d
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | import std.stdio;
void dotimes(uint count, void delegate(int) dg){
for(uint i; i < count; i++)
dg(i);
}
void main(){
// 一カ所でしか使われないのに関数を作っている
void printMona(int i){
writeln(i, ":mona");
}
dotimes(3, &printMona); // 使用している場所
writeln();
// 使われる一カ所にデリゲートリテラルを埋め込む
dotimes(2, delegate void(int i){writeln(i, ":giko");});
writeln();
// デリゲートリテラルの戻り値は自動推論させることもできる
dotimes(1, delegate(int i){writeln(i, ":cii");});
writeln();
// デリゲートリテラルの delegate という文字は省略できる
dotimes(3, (int i){writeln(i, ":>>2");});
}
|
literal.d の実行結果は:
[cactus:~/code_d/d_tuts]% ./literal
0:mona
1:mona
2:mona
0:giko
1:giko
0:cii
0:>>2
1:>>2
2:>>2