Un ciclo è una struttura di controllo che permette di eseguire del codice ripetutamente in base a una determinata condizione.
Un ciclo while è una struttura di controllo che permette di eseguire del codice ripetutamente in base a una determinata condizione. Il codice all'interno di un ciclo while continua a essere eseguito finché la condizione è vera. I cicli while si usano spesso quando il numero di iterazioni non è noto in anticipo, ma vanno bene in qualsiasi situazione in cui serve un ciclo.
La condizione viene valutata prima che il codice all'interno del ciclo venga eseguito: se la condizione è falsa, il codice dentro il ciclo non verrà mai eseguito.
i = 0
while i < 3
puts i
i += 1
end
# Output:
# 0
# 1
# 2
Quando vuoi iterare su una stringa, puoi farlo sfruttando la lunghezza della stringa.
str = "Hello"
i = 0
while i < str.size
puts str[i]
i += 1
end
# Output:
# H
# e
# l
# l
# o
I cicli until funzionano come i cicli while, con la differenza che il codice all'interno del ciclo continua a essere eseguito finché la condizione non diventa vera.
È la stessa differenza che c'è tra if e unless.
i = 0
until i == 3
puts i
i += 1
end
Un errore comune con i cicli while è entrare in un «ciclo infinito», che non termina mai. Un ciclo infinito può essere causato da una condizione che non diventa mai vera né falsa. Spesso è colpa di un errore del programmatore, per esempio dimenticare di incrementare la variabile del ciclo. A volte, però, un ciclo infinito è il modo più chiaro per implementare la logica del programma. O è vitale ripetere all'infinito: un server HTTP, per esempio, aspetta una connessione in arrivo, la gestisce e poi aspetta la connessione successiva.
La parola chiave break permette di uscire da un ciclo in anticipo.
Può essere comoda quando vuoi uscire da un ciclo in anticipo al verificarsi di certe condizioni.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
La parola chiave next permette di passare direttamente all'iterazione successiva di un ciclo.
Può essere comoda quando vuoi saltare determinate iterazioni di un ciclo.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Il tipo di una variabile può cambiare durante un ciclo.
Nell'esempio seguente, il tipo di a è Int32 | String perché nella prima parte del ciclo può essere Int32 oppure String.
La variabile a mantiene il tipo Int32 | String solo nella prima parte del ciclo: quando il ciclo inizia contiene un Int32, mentre nella seconda iterazione contiene una String.
Questo sistema di tipi multipli sarà spiegato in dettaglio più avanti.
Dato però che nella seconda parte del ciclo siamo sicuri che conterrà solo una String, il tipo di a è String in quella parte del ciclo.
A runtime non conterrà mai Int32 e String nello stesso momento.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
Un while può essere usato come espressione, cioè come valore di una variabile.
Il valore restituito è quello indicato con la parola chiave break.
Non restituisce il valore dell'ultima espressione del ciclo.
a = while true
break 1
end
p a
# => 1
i = 0
a = while i == 0
i += 1
1
end
p a
# => nil