Zasada działania funkcji anonimowych

Zasada działania funkcji anonimowych
  • Rejestracja: dni
  • Ostatnio: dni
0

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

Kopiuj
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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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

  • Rejestracja: dni
  • Ostatnio: dni
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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
0

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

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

  • Rejestracja: dni
  • Ostatnio: dni
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?

Patryk27
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 13042
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.

  • Rejestracja: dni
  • Ostatnio: dni
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ą

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.