回答編集履歴
3
さらに追記
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
修正
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
追記
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
|
+
```
|