回答編集履歴

3

さらに追記

2016/07/13 22:38

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -38,6 +38,12 @@
38
38
 
39
39
  Debug.WriteLine(mul(3));
40
40
 
41
+
42
+
43
+ mul = createMul(5);
44
+
45
+ Debug.WriteLine(mul(3)); // この結果は 15 になる。
46
+
41
47
  }
42
48
 
43
49
 

2

修正

2016/07/13 22:38

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -42,9 +42,13 @@
42
42
 
43
43
 
44
44
 
45
+ // クロージャを作って返すメソッド
46
+
45
47
  private Func<int, int> createMul(int a)
46
48
 
47
49
  {
50
+
51
+ // f(b) とした時に a * b を返すクロージャを返す
48
52
 
49
53
  return b => a * b;
50
54
 

1

追記

2016/07/13 22:29

投稿

Zuishin
Zuishin

スコア28660

test CHANGED
@@ -13,3 +13,43 @@
13
13
  通常であれば、f を他の場所で実行する時には変数 a は消滅しているので使用できません。しかし、f がクロージャであればこれを使用できます。
14
14
 
15
15
  作られたときにあった a をそのまま持って行っているからです。
16
+
17
+ ###追記
18
+
19
+ タグに無いので適切ではないかもしれませんが、C# の例です。
20
+
21
+ ```C#
22
+
23
+ /// ボタンが押されたときに実行
24
+
25
+ private void button1_Click(object sender, EventArgs e)
26
+
27
+ {
28
+
29
+ // クロージャ取得
30
+
31
+ var mul = createMul(2);
32
+
33
+
34
+
35
+ // mul(3) を実行し、それをデバッグコンソールに書き出す。
36
+
37
+ // 作られたときの 2 が保存されているので、この結果は 6 となる。
38
+
39
+ Debug.WriteLine(mul(3));
40
+
41
+ }
42
+
43
+
44
+
45
+ private Func<int, int> createMul(int a)
46
+
47
+ {
48
+
49
+ return b => a * b;
50
+
51
+ }
52
+
53
+ ```
54
+
55
+