関数リテラルとデリゲートリテラル

デリゲートや関数ポインタを使うようになると, わざわざ独立した関数を書くのが無駄 な場面があることに気がつく (イベントハンドラが典型例. 他にスレッド関数, コールバック関数などがありがち)

そんなとき, 関数リテラルとデリゲートリテラルをコードに直接埋め込むことができる.

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

Previous topic

デリゲート

Next topic

pure 関数