PascalABC.NET

Захват переменных в лямбда-выражении

Лямбда-выражение может использовать переменные из внешнего контекста. Такие переменные называются захваченными лямбда-выражением.

Пример 1. Захват переменной в запросе Select.

begin  var a := Seq(2,3,4);
  var z := 1;
  var q := a.Select(x->x+z);
  q.Println;
  z := 2;
  q.Println;
end.

Здесь лямбда-выражение x->x+z захватывает внешнюю переменную z. Важно заметить, что при изменении значения переменной z запрос a.Select(x->x+z), хранящийся в переменной q, выполняется с новым значением z.

Пример 2. Накопление суммы во внешней переменной.

begin
  var sum := 0;
  var AddToSum: integer -> () := procedure (x) -> begin sum += x; end;

  AddToSum(1);
  AddToSum(3);
  AddToSum(5);

  writeln(sum);
end.