Захват переменных в лямбда-выражении
Лямбда-выражение может использовать переменные из внешнего контекста. Такие переменные называются захваченными лямбда-выражением.
Пример 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.