Vanaf het begin zijn gebieden (Range) in Kotlin geïntroduceerd om bewerkingen met opeenvolgende waarden te vereenvoudigen – dit is overgenomen van talen met een beknopte syntaxis voor wiskundige bewerkingen (bijv. Python). Bovendien is de Range-mechanisme uitgebreid naar Progression, waardoor de stapgrootte kan worden ingesteld en verschillende soorten getallen en tekens worden ondersteund.
Itereren over gehele getallen, letters, tijdstippen, enz. vereist vaak een speciale syntaxis en betrouwbare ondersteuning in de standaardbibliotheek; anders wordt de code onhandig, onleesbaar en vatbaar voor fouten aan de randen.
In Kotlin zijn er standaardtypen zoals IntRange, CharRange en LongRange, evenals Progression voor stapgewijze iteratie. Daarnaast kunnen gebieden worden gedefinieerd voor willekeurige vergelijkbare types.
// Eenvoudig gebied for (i in 1..5) print(i) // 12345 // Gebied met stapgrootte for (i in 1..10 step 2) print(i) // 13579 // Teruglopend gebied for (i in 5 downTo 1) print(i) // 54321 // Eigen gebied (bijvoorbeeld voor 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)
Belangrijkste kenmerken:
.., downTo, until, stepWat is het verschil tussen de expressie 1..5 en 1 until 5?
1..5 omvat beide uiteinden van het gebied: 1,2,3,4,5. 1 until 5 sluit het laatste element uit: 1,2,3,4.
Is het mogelijk om een gebied met een negatieve stapgrootte te definiëren met behulp van step?
Nee. Voor dalende gebieden gebruik je de constructie downTo, en vervolgens step: 5 downTo 1 step 2 (je krijgt 5,3,1).
Is het mogelijk om gebieden te gebruiken met types die geen Comparable implementeren?
Nee. Voor het maken van een gebied moet het type vergelijkingen ondersteunen. In andere gevallen staat de compiler de definitie niet toe.
In de code is in plaats van 1 until n+1 1..n gebruikt. We krijgen een extra element, de lus gaat buiten het toegestane gebied.
Voordelen:
Nadelen:
for (i in 0 until n) wordt gebruikt voor de indexering van een array van lengte n, het gebied komt strikt overeen met de toegestane indexwaarden.
Voordelen:
Nadelen: