Zasada działania funkcji anonimowych

0

Chciałbym wiedzieć w jaki sposób działają funkcje anonimowe. Powiedzmy że mam taki kod:

procedure Foo();
var
 x:Integer;
begin
 x:=1;
 JakaśfunkcjaOczekującajakoParametrFunkcjeAno(procedure()
 var 
  y:Integer;
 begin
  y:=x;
 end);

end;

czy dobrze rozumiem? W momencie gdy zostanie zadeklarowana procedure anonimowa, zostaje pobierana bieżąca wartość parametrów nadrzędnych? Czyli wewnątrz funkcji anonimowej "x" zawsze będzie miała wartość "1" bo taka była w momencie deklaracji funkcji?

2

"Łapane" (capture) są zmienne, a nie ich konkretne wartości.
Czyli pobrana będzie wartość zmiennej x jaką ma ona w miejscu jej referencji, a nie z jaką została zadeklarowana.

http://docwiki.embarcadero.com/RADStudio/XE2/en/Anonymous_Methods_in_Delphi#Variable_Binding_Mechanism

0

zmienne ale razem z wartościami chyba? Przecież po ucieczce z tamtej funkcji Foo() zmienna X nie istnieje bo jest lokalną która zostanie zwolniona, a to kiedy sie wywoła anonimową może być różna, skompilować sie skompiluje, błędu nie wywali, więc musi być tak jak myśle prawda?

0

Nie przeczytałeś tego artykułu, który zalinkowałem :P

Captured variables are stored on the heap, not the stack.

0

ok przeczytałem, a co jeśli w parametrze funkcji anonimowej, odwołuje sie do tych zmiennych nadrzędnych, ale z poziomu wątku? Powiedzmy że to tylko odczyt. Chyba nie ma stracha, bo na milion nic już tej zmiennej prócz mojej funkcji anonimowej nie trzyma prawda?

0

Ciężko się czyta Twoje posty - jak mniemam masz na myśli sytuację w stylu uruchomienia wątku wykonującego anonimową funkcję, która odczytuje jakieś zmienne z jej funkcji-matki.
Sytuacja taka sama, 100% safe.

0

ciężko ale jednak odczytałeś co mam na myśli :D tak, napisałem sobie klase która odpala wątek z kodem zawartym w funkcji anonimowej, i bałem sie czy to wszystko mi sie nie rozsypie ;)

ps. skoro odczyt jest 100% to co sie dzieje z zapisem? raczej kiepsko?

to bez sensu, jeśli odwołanie sie z poziomu funkcji anonimowej "przedłuża życie" nadrzędnej zmiennej, to skąd wiadomo czy kod zostanie w ogóle wywołany, i czy w wątku? Tak w tym linku piszą

1 użytkowników online, w tym zalogowanych: 0, gości: 1