Introduzione a Kotlin: Costrutti base
Adesso, dopo aver fatto l'Hello World! e la lettura da tastiera, mi sono stancato di testare a caso e cerco online qualcosa. Trovo una pagina in italiano che spiega un po' i costrutti if, else, while... L'if e l'else molto simili a quelli del Java e C# (in quanto accettano solo un valore booleano)
- Andiamo via veloci, iniziando con il classico if. La sintassi è semplice:
if (espressione booleana) {
codice
}
if (espressione booleana) {
codice
}
else {
codice
}
if (espressione booleana 1) {
codice
}
else if (espressione booleana 2) {
codice
}
else if (espressione booleana 3) {
codice
}
..... altri eventuali branch che iniziano con else if (espressione booleana n-esima) {}
else {
codice
}
- Con "espressione booleana" si intende un'istruzione che restituisce un valore booleano, cioè vero o falso.
Ma poi noto qualcosa di strano: L'istruzione when, dalle mie conoscenze di inglese deduco che sia una specie di if/else o switch. E lo è!
fun main(args: Array<String>) {
print("Inserisci un valore: ")
val x1 = Integer.parseInt(readLine())
when(x1)
{
0 -> println("Inserito il valore 0")
1 -> println("Inserito il valore 1")
2 -> println("Inserito il valore 2")
else -> println("Inserito valore diverso da 0, 1 o 2")
}
}
Infatti sembra proprio uno switch con, però, un formalismo assai diverso. Bello!
Poi noto questa nota:
- Possiamo anche comprendere più casi insieme, separando i valori con una virgola:
when(x1) {
0, 1, 2, 3, 4, 5, 6, 7, 8, 9 -> println("Inserito valore < 10")
else -> println("Inserito valore in doppia cifra")
}
- Se volete, è anche meglio, in casi come questo, utilizzare una scrittura alternativa:
when(x1) {
in 0..9 -> println("Inserito valore < 10")
else -> println("Inserito valore in doppia cifra")
}
- Inoltre possiamo anche il when come completa alternativa a if, questo si ottiene quando non si propone un argomento a when; in quel caso ogni branch è caratterizzato dalla presenza di una espressione booleana e quindi viene eseguito il branch che sottende la prima espressione che risulta true:
when {
(x1 % 2 == 0) -> println("Pari")
(x1 % 2 != 0) -> println("Dispari")
}
Infine ultima nota brutta e bella del Kotlin: non esiste l'operatore ternario, ma sia l'if che il when possono essere usati come alternativa:
var s1 = if(x1 == 3) 5 else if(x1 == 4) 6 else 0
var s2 = when(x1) {
3 -> 5
4 -> 6
else -> 0
}
Queste piccolezze sono utili, e rendono leggibile l'operatore ternario, tanto odiato da certe persone. Poi passo al for, e più che for è un foreach, ma tanto sappiamo che per le cose che il foreach non riesce a fare c'è il while. Il costrutto verrà analizzato in dettaglio in futuro, ma intanto lascio un esempio:
for (x2 in 1..x1) {
println(x2)
}
L'operatore .., come si immagina serve per creare un range di elementi.
Pero noto questa cosa interessante:
- se volete cambiare il passo dovrete usare step:
for (x2 in 1..x1 step 2)
- terrà il passo due, saltando quindi un elemento ogni due.
- Un altro problema spesso ignorato è quello di percorrere il ciclo all'inverso, ovvero dall'elemento a più alto valore a quello più basso. Non funziona scrivere
for (x in 100..1) // sbagliato. Attenzione che però l'operatore di range non genera nessuna eccezione, ma diventa un nullo
- il ciclo non partirebbe neanche, la scrittura giusta è:
for (x in 100 downTo> 1)
- anche in questo caso si può aggiungere uno step.
Amaramente noto che il while e do-while sono intatti come nei classici linguaggi (qualche modifica ci stava, per esempio per ripristinare il for eliminato...)
while (x2 < x1) {
println(x2)
x2++
}
do {
println(x2)
x2++
} while(x2 < x1)