いぬおさんのおもしろ数学実験室

おいしい紅茶でも飲みながら数学、物理、工学、プログラミング、そして読書を楽しみましょう

デリゲート、匿名メソッド、ラムダ式を分かりやすく説明する

 やや分かりづらいところです。例によって最小限のコードで、限界まで分かりやすく説明しましょう。
 デリゲートについては既に記事にしてあります。なるべく参照する必要のないように書きますが、少しでも「??」と思ったらお読みください。
www.omoshiro-suugaku.com

 さて、以下のコードをご覧ください。

//■■■ (A)
delegate int dlg(int x, int y);

void func()
{
    dlg d;
    //■■■(B)
    int add (int x, int y) { //和を求める関数を定義しておく
        return (x + y);
    }
    d = add;
    Debug.Log(d(1, 5)); //結果は6

    //■■■(C)
    d = delegate (int x, int y) { //匿名メソッド
        return (x - y);
    }; //←注意!「;」が必要!
    Debug.Log(d(1, 5)); //結果は-4

    //■■■(D)
    d = (x, y) => x + y; //ラムダ式
    Debug.Log(d(5, 7)); //結果は12
}

 まず関数func()の外でデリゲートを宣言しておきます。(A)のところです。func()内では
dlg d;
と宣言してあります。これで d には関数を代入することができるようになります。それをやったのが(B)。関数 add(x, y) (単に2数の和を求めるはたらき)を定義し、d = add と代入すると d を用いて関数 add を呼び出せます。ここまでは前に書いた記事の内容です。

 (C)が匿名メソッドの説明です。(B)の書き方だと、add()という関数をあらかじめ定義しておかなければなりません。(C)ではその必要はありません。キーワード delegate を関数名のように使ってその場で足し算をする関数を定義し、すぐにそれを使えるのです。
 ちなみに……直後に

    d = delegate (int x, int y) { //匿名メソッド
        return (x * y);
    };
    Debug.Log(d(3, 5)); //結果は15

と追加すれば、積を計算できます。足し算のために add, かけ算のために mult など、いちいち関数を定義する必要がないのです。

 最後に(D)のラムダ式です。(C)の匿名メソッドでは キーワード delegate を使って関数を定義しなければなりませんでした。でも「必ず使うもの」は書く必要がないとも言えるのですね。匿名メソッドの書き方を省略したのがラムダ式です。確かに(D)のように

d = (x, y) => x + y; //ラムダ式
Debug.Log(d(5, 7)); //結果は12

と書いてあれば意味は分かりますよね。(x, y) は関数の引数、=> の右にある x + y が関数本体です。なお、関数本体の行数が2行以上なら次のように「{ }」を用いればOKです。

d = (x, y) => 
{
    int z = x + y;
    return 2 * z;
};
Debug.Log(d(5, 7)); //結果は24

なお、「}」のすぐ後に「;」が必要なので気をつけましょう。

 これでもう他の人の書いたコードにデリゲート、匿名メソッド、ラムダ式が出てきても心配ありません! 例え分からなくても、ネットで少し調べれば理解できるようになっているはずです!!