導入
ラムダ式は、自分の外にある変数を「覚えて」使えます。これをクロージャと呼びます。設定値を閉じ込めた専用の処理を作る、といった強力な使い方ができます。
図解
flowchart LR
OUT["外の変数 rate = 0.1"] -.->|捕まえる(キャプチャ)| L["ラムダ price => price * rate"]
L --> F["rate を覚えた専用関数"]
サンプル
// 外の変数 taxRate を「覚えた」関数を作って返す
Func<int, int> MakeTaxCalculator(double taxRate)
{
// このラムダは taxRate をキャプチャ(記憶)する
return price => (int)(price * (1 + taxRate));
}
var withTax10 = MakeTaxCalculator(0.10);
var withTax8 = MakeTaxCalculator(0.08);
Console.WriteLine(withTax10(1000)); // 1100(10%を覚えている)
Console.WriteLine(withTax8(1000)); // 1080(8%を覚えている)
- ラムダは外側の変数をキャプチャ(記憶)して後から使える=クロージャ
- 「設定値を閉じ込めた専用関数」を量産できる
- 各クロージャは自分がキャプチャした値を独立して保持する
演習
var addFive = MakeAdder(5);
Console.WriteLine(addFive(10)); // 15
// TODO: 「n を足す関数」を返す MakeAdder(int n) を定義してください(クロージャで n を記憶)
___
- 期待される出力:
15
ヒント1を見る
Func<int, int> MakeAdder(int n) => x => x + n;
ヒント2を見る
返すラムダが引数nを覚えます
まとめ
- クロージャはラムダが外側の変数を記憶する仕組み
- 設定値を閉じ込めた専用処理を作れる
- 各クロージャは捕まえた値を独立して保持する
次回: 変化を通知する仕組み「イベント」です。