Fin dall'inizio, in Kotlin sono stati introdotti gli intervalli (Range) per semplificare le operazioni su insiemi di valori sequenziali — questo è ereditato da linguaggi con una sintassi concisa per lavorare con i numeri (ad esempio, Python). Inoltre, il meccanismo Range è stato esteso a Progression, consentendo di specificare il passo di iterazione e supportare diversi tipi di numeri e caratteri.
L'iterazione su numeri interi, lettere, punti temporali, ecc. richiede spesso una sintassi speciale e un supporto affidabile nella libreria standard, altrimenti il codice diventa ingombrante, illeggibile e soggetto a errori nei confini.
In Kotlin ci sono i tipi standard IntRange, CharRange e LongRange, oltre a Progression per l'iterazione con passo. Inoltre, è possibile definire intervalli per tipi comparabili arbitrari.
// Intervallo semplice for (i in 1..5) print(i) // 12345 // Intervallo con passo for (i in 1..10 step 2) print(i) // 13579 // Intervallo inverso for (i in 5 downTo 1) print(i) // 54321 // Intervallo personalizzato (ad esempio, per Version) data class Version(val major: Int, val minor: Int): Comparable<Version> { override fun compareTo(other: Version): Int = compareValuesBy(this, other, Version::major, Version::minor) } operator fun ClosedRange<Version>.iterator(): Iterator<Version> = object : Iterator<Version> { var current = start override fun hasNext() = current <= endInclusive override fun next() = current.also { current = Version(current.major, current.minor + 1) } } val v1 = Version(1, 0) val v2 = Version(1, 3) for (v in v1..v2) println(v)
Caratteristiche principali:
.., downTo, until, stepQual è la differenza tra l'espressione 1..5 e 1 until 5?
1..5 include entrambi gli estremi dell'intervallo: 1,2,3,4,5. 1 until 5 non include l'ultimo elemento: 1,2,3,4.
È possibile definire un intervallo con passo inferiore a zero utilizzando step?
No. Per gli intervalli decrescenti, usa la costruzione downTo, poi step: 5 downTo 1 step 2 (ottieni 5,3,1).
È possibile utilizzare intervalli con tipi che non implementano Comparable?
No. Per creare un intervallo, è necessario che il tipo supporti il confronto. Altrimenti, il compilatore non consentirà la definizione.
Nel codice, invece di 1 until n+1 è stato utilizzato 1..n. Otteniamo un elemento in più, il ciclo esce dai limiti consentiti.
Pro:
Contro:
Si utilizza for (i in 0 until n) per indicizzare un array di lunghezza n, l'intervallo corrisponde esattamente ai valori consentiti degli indici.
Pro:
Contro: