Prism обрабатывает захват локальных переменных иначе, чем нативный Delphi или C #.
В этих 2 все ссылки в вашем коде этих локальных объектов будут сопоставлены с полями сгенерированного компилятором класса, который будет содержать ваш анонимный метод.
В призме эти локальные объекты остаются обычными локальными, но поля этих скрытых полей устанавливаются при создании экземпляра анонимного метода.
Один из способов получить рекурсивную лямбду - это использовать ссылочный тип для хранения лямбды.
Все это звучит намного сложнее, чем на самом деле.
2 способа достижения цели:
1)
var fib := new class(Call : Func<Integer, Integer> := nil);
fib.Call := n -> iif(n > 1, fib.Call(n - 1) + fib.Call(n - 2), n);
var x := fib.Call(3);
2) Если вы не хотите иметь ссылку на эту оболочку, вы можете сделать это так:
var fib : Func;
with fibWrapper := new class(Call : Func<Integer, Integer> := nil) do
begin
fibWrapper.Call := n -> iif(n > 1, fibWrapper.Call(n - 1) + fibWrapper.Call(n - 2), n);
fib := fibWrapper.Call;
end;
Кстати, причина, по которой Prism здесь не следует C #, заключается в том, что для многопоточности и зацикливания повторное использование захваченных переменных создает серьезные странные проблемы во время выполнения.
В Prism захваты действительно захватываются, когда вы назначаете анонимный метод или лямбду. Который имеет определенное неизменное прикосновение к нему ...
Ура,
Роберт