Un ciclo è una struttura di controllo che permette di eseguire ripetutamente del codice in base a una determinata condizione.
Un ciclo while è una struttura di controllo che permette di eseguire ripetutamente del codice in base a una determinata condizione. Il codice all'interno di un ciclo while continua a essere eseguito finché la condizione è veritiera. I cicli while sono spesso usati quando il numero di iterazioni non è noto in anticipo; possono essere usati in qualsiasi situazione in cui serve un ciclo.
La condizione viene valutata prima che il codice all'interno del ciclo venga eseguito, il che significa che se la condizione è falsa, il codice all'interno del 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 usare un ciclo sulla 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 è veritiera.
È come la differenza 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 restituisce mai un valore veritiero o falso. Spesso è dovuto a 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. Oppure è essenziale avere un ciclo infinito; per esempio, un server HTTP attende una connessione in entrata, la gestisce e poi attende la connessione successiva.
La parola chiave break può essere usata per uscire anticipatamente da un ciclo.
Questo può essere comodo quando vuoi uscire da un ciclo in anticipo in determinate condizioni.
i = 0
while i <= 3
puts i
i += 1
if i == 2
break
end
end
# Output:
# 0
# 1
La parola chiave next può essere usata per saltare all'iterazione successiva di un ciclo.
Questo può essere comodo quando vuoi saltare iterazioni specifiche di un ciclo.
i = 0
while i <= 3
i += 1
if i == 2
next
end
puts i
end
# Output:
# 1
# 3
Il tipo della variabile può essere diverso durante i cicli.
Nell'esempio seguente, il tipo di a è Int32 | String perché può essere Int32 o String nella prima parte del ciclo.
La variabile a avrà il tipo Int32 | String solo nella prima parte del ciclo, dato che quando il ciclo inizia contiene Int32, e nella seconda iterazione contiene una String.
Questo sistema a tipi multipli sarà spiegato in dettaglio più avanti.
Ma poiché siamo sicuri che la seconda parte del ciclo conterrà solo String, il tipo di a è String nella seconda parte del ciclo.
A runtime, non conterrà mai simultaneamente Int32 e String.
i = 0
a = 4
while i < 3
p typeof(a)
# => Int32 | String
a = "4"
p typeof(a)
# => String
i += 1
end
In Crystal, l'ultima espressione in un metodo restituisce il suo valore.
Tuttavia, a volte è necessario restituire un valore prima dell'ultima espressione.
Per questo, puoi usare la parola chiave return, che restituirà il valore dell'espressione seguente.
Il codice scritto dopo una parola chiave return non verrà eseguito.
def speed_limit(road_number)
if road_number == 1
return 50
puts "This will not be executed"
elsif road_number == 2
return 80
puts "This will not be executed"
end
100
end
p speed_limit(1) # => 50
p speed_limit(2) # => 80
p speed_limit(3) # => 100
La parola chiave return dovrebbe essere omessa quando l'ultima espressione in un metodo è il valore che dovrebbe essere restituito.
In questo esercizio lavorerai con i conti di risparmio. Ogni anno, il saldo del tuo conto di risparmio viene aggiornato in base al suo tasso di interesse. Il tasso di interesse che la tua banca ti concede dipende dalla quantità di denaro presente sul conto (il suo saldo):
1000 dollari.1000 dollari e inferiore a 5000 dollari.5000 dollari.Hai quattro compiti, ognuno dei quali riguarda il saldo e il suo tasso di interesse.
Implementa il metodo SavingsAccount.interest_rate(), che prende un saldo come argomento.
Il metodo deve restituire il tasso di interesse per il saldo dato.
SavingsAccount.interest_rate(200.75)
# => 0.5
Implementa il metodo SavingsAccount.interest(), che prende un saldo come argomento.
Il metodo deve restituire l'interesse per il saldo dato.
SavingsAccount.interest(200.75)
# => 1.00375
Implementa il metodo SavingsAccount.annual_balance_update(), che prende un saldo come argomento.
Il metodo deve restituire il saldo dopo un anno.
SavingsAccount.annual_balance_update(200.75)
# => 201.75375
Implementa il metodo SavingsAccount.years_before_desired_balance(), che prende un saldo e un saldo obiettivo come argomenti.
Il metodo deve restituire il numero di anni necessari per raggiungere il saldo obiettivo.
balance = 200.75
target_balance = 214.88
SavingsAccount.years_before_desired_balance(balance, target_balance)
# => 14
Quando si applica l'interesse semplice a un saldo iniziale, il saldo viene moltiplicato per il tasso di interesse e il prodotto dei due è l'importo dell'interesse.
L'interesse composto, invece, si applica a intervalli ricorrenti. A ogni applicazione, l'importo dell'interesse viene calcolato e aggiunto al saldo iniziale, così che i calcoli successivi degli interessi si basino su un saldo iniziale maggiore.
Iscriviti a Exercism per imparare e padroneggiare Crystal con 26 concetti142 esercizi e il mentoring di persone reali, tutto gratis.