質問するログイン新規登録

回答編集履歴

3

さらに追記

2016/07/13 22:38

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -18,6 +18,9 @@
18
18
  // mul(3) を実行し、それをデバッグコンソールに書き出す。
19
19
  // 作られたときの 2 が保存されているので、この結果は 6 となる。
20
20
  Debug.WriteLine(mul(3));
21
+
22
+ mul = createMul(5);
23
+ Debug.WriteLine(mul(3)); // この結果は 15 になる。
21
24
  }
22
25
 
23
26
  // クロージャを作って返すメソッド

2

修正

2016/07/13 22:38

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -20,8 +20,10 @@
20
20
  Debug.WriteLine(mul(3));
21
21
  }
22
22
 
23
+ // クロージャを作って返すメソッド
23
24
  private Func<int, int> createMul(int a)
24
25
  {
26
+ // f(b) とした時に a * b を返すクロージャを返す
25
27
  return b => a * b;
26
28
  }
27
29
  ```

1

追記

2016/07/13 22:29

投稿

Zuishin
Zuishin

スコア28675

answer CHANGED
@@ -5,4 +5,23 @@
5
5
  例えばローカル変数 a が存在する関数内で別の関数 f を宣言します。f 内では a を使用します。
6
6
  f を関数ポインタとして他の関数に渡します。
7
7
  通常であれば、f を他の場所で実行する時には変数 a は消滅しているので使用できません。しかし、f がクロージャであればこれを使用できます。
8
- 作られたときにあった a をそのまま持って行っているからです。
8
+ 作られたときにあった a をそのまま持って行っているからです。
9
+ ###追記
10
+ タグに無いので適切ではないかもしれませんが、C# の例です。
11
+ ```C#
12
+ /// ボタンが押されたときに実行
13
+ private void button1_Click(object sender, EventArgs e)
14
+ {
15
+ // クロージャ取得
16
+ var mul = createMul(2);
17
+
18
+ // mul(3) を実行し、それをデバッグコンソールに書き出す。
19
+ // 作られたときの 2 が保存されているので、この結果は 6 となる。
20
+ Debug.WriteLine(mul(3));
21
+ }
22
+
23
+ private Func<int, int> createMul(int a)
24
+ {
25
+ return b => a * b;
26
+ }
27
+ ```