0Pricing
Ruby Academy · Lezione

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.call

La 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.call

Le 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 total

Sopravvivere 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.call

Stati 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.call

I 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 100

Variabili 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  # unchanged

Creare 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).inspect

Incapsulare 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.call

Mettere 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.call

Domande 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

  1. Riepilogo dei blocchi
  2. Proc
  3. Lambda
  4. Closure e ambito
← Torna a Ruby Academy