Closure e ambito
Catturare variabili
Closure e ambito è una lezione Ruby Academy gratuita su CoddyKit. Questa è la lezione 4 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Ruby Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Ruby Academy include 4 lezioni in totale.
Catturare le variabili
Una closure è una funzione che ricorda le variabili del contesto in cui è stata definita, anche dopo che quel contesto ha terminato l'esecuzione. Proc e lambda sono closure.
name = "Ada"
greeter = -> { puts "Hello, #{name}" }
greeter.callLa variabile resta associata
La closure non copia il valore: mantiene un riferimento attivo alla variabile. Se la variabile cambia in seguito, la closure vede il nuovo valore.
count = 0
reader = -> { count }
count = 5
puts reader.callLe closure possono modificare le variabili
Poiché il riferimento è attivo, una closure può anche modificare la variabile catturata.
total = 0
adder = ->(n) { total += n }
adder.call(3)
adder.call(7)
puts totalSopravvivere al metodo che le racchiude
La variabile catturata continua a esistere finché esiste la closure, anche dopo che il metodo che l'ha creata ha restituito il proprio valore.
def counter
n = 0
-> { n += 1 }
end
c = counter
puts c.call
puts c.call
puts c.callStati indipendenti
Ogni chiamata al metodo factory crea una nuova variabile, quindi closure separate mantengono stati separati.
def counter
n = 0
-> { n += 1 }
end
a = counter
b = counter
puts a.call
puts a.call
puts b.callI parametri dei blocchi sono locali
I parametri dichiarati tra le barre sono locali al blocco e non fuoriescono mai, anche se esiste una variabile con lo stesso nome.
x = 100
[1, 2, 3].each { |x| }
puts x # still 100Variabili locali al blocco
Elencare nomi aggiuntivi dopo un punto e virgola tra le barre li rende locali al blocco, proteggendo le variabili esterne da modifiche accidentali.
y = "outer"
[1].each { |i; y| y = "inner" }
puts y # unchangedCreare funzioni configurabili
Le closure permettono di incorporare una configurazione in una funzione una sola volta e di riutilizzarla molte volte.
def power_of(exp)
->(base) { base ** exp }
end
square = power_of(2)
cube = power_of(3)
puts square.call(5)
puts cube.call(2)Le closure nelle iterazioni
Un errore comune: una closure creata in un ciclo cattura la variabile, non un'istantanea del suo valore. Creare closure a ogni iterazione permette di catturare ogni valore separatamente.
funcs = [1, 2, 3].map { |i| -> { i } }
puts funcs.map(&:call).inspectIncapsulare lo stato privato
Le closure possono nascondere lo stato dietro funzioni, una forma iniziale di oggetti. Qui il saldo è irraggiungibile se non attraverso le lambda restituite.
def make_account(start)
balance = start
deposit = ->(n) { balance += n }
show = -> { balance }
[deposit, show]
end
dep, show = make_account(100)
dep.call(50)
puts show.callMettere tutto insieme
Le closure legano il codice al contesto in cui è stato creato:
- Catturano riferimenti attivi alle variabili circostanti.
- Lo stato sopravvive alla restituzione del metodo che lo racchiude.
- Ogni closure mantiene variabili indipendenti.
def tagger(prefix)
->(text) { "[#{prefix}] #{text}" }
end
warn = tagger("WARN")
puts warn.call("low disk space")Verifica rapida
Verifichi la comprensione delle closure.
Riepilogo
Ha imparato a usare le closure e l'ambito:
- Proc e lambda catturano per riferimento le variabili circostanti.
- Lo stato catturato sopravvive al metodo che lo racchiude.
- Ogni closure conserva uno stato indipendente.
- I parametri dei blocchi restano locali; usi
;per le variabili locali al blocco.
def stepper(by)
pos = 0
-> { pos += by }
end
s = stepper(5)
puts s.call
puts s.callDomande Frequenti
La lezione «Closure e ambito» è gratuita?
Sì — il testo completo di «Closure e ambito» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Ruby Academy, passa a CoddyKit PRO. Il corso Ruby Academy include 4 lezioni in totale.
Cosa imparerò in «Closure e ambito»?
Catturare variabili Eserciti Ruby Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare Ruby Academy?
Non è richiesta alcuna esperienza precedente. Ruby Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 4 di 4.
Quanto tempo richiede la lezione «Closure e ambito»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione Ruby Academy?
Sì. Ogni lezione Ruby Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Riepilogo dei blocchi
- Proc
- Lambda
- Closure e ambito