Una delle prime cose che cerco di imparare in un linguaggio di programmazione non familiare è come gestisce le chiusure. La loro semantica è spesso intrecciata con il modo in cui la lingua gestisce gli ambiti e vari altri aspetti delicati, quindi la loro comprensione rivela molti altri aspetti della lingua. Inoltre, le chiusure sono un costrutto molto potente e spesso riducono il numero di piastre che devo digitare. Così ho dovuto vedermela con chiusure perl e sono incappato in un po 'Gotcha:
my @closures;
foreach (1..3) {
# create some closures
push @closures, sub { say "I will remember $_"; };
}
foreach (@closures) {
# call the closures to see what they remember
# the result is not obvious
&{$_}();
}
Quando ho scritto il codice di cui sopra mi aspettavo di vedere
I will remember 1
I will remember 2
I will remember 3
ma invece ho ottenuto I will remember CODE(0x986c1f0)
.
L'esperimento precedente ha rivelato che $_
è molto dipendente dal contesto e se appare in una chiusura, il suo valore non viene fissato al momento della creazione della chiusura. Si comporta più come un riferimento. Quali altri trucchi devo sapere quando creo chiusure in perl?
Ma questo è praticamente lo stesso di usare 'foreach my $ num ...'. – davidk01
Quindi se chiudono solo su variabili lessicali cosa succede ad altri tipi di variabili? La chiusura usa il valore disponibile durante il sito di chiamata come fa per '$ _'? – davidk01
@ davidk01: come in qualsiasi altro linguaggio di programmazione che consente le variabili globali, le chiusure si chiudono effettivamente su quella variabile come normale. Hai appena dimenticato che è globale e può quindi cambiare quando un altro codice imposta il suo valore su qualcos'altro (come il sottotitolo anonimo stesso quando viene chiamato). – slebetman