やや分かりづらいところです。例によって最小限のコードで、限界まで分かりやすく説明しましょう。
デリゲートについては既に記事にしてあります。なるべく参照する必要のないように書きますが、少しでも「??」と思ったらお読みください。
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
なお、「}」のすぐ後に「;」が必要なので気をつけましょう。
これでもう他の人の書いたコードにデリゲート、匿名メソッド、ラムダ式が出てきても心配ありません! 例え分からなくても、ネットで少し調べれば理解できるようになっているはずです!!