Von Anfang an wurden in Kotlin Bereiche (Range) eingeführt, um Operationen mit aufeinanderfolgenden Werten zu erleichtern - dies ist von Sprachen mit prägnanter Syntax im Umgang mit Zahlen (wie z.B. Python) übernommen worden. Darüber hinaus wurde der Mechanismus von Range auf Progression erweitert, was es ermöglicht, den Schritt der Iteration festzulegen und verschiedene Arten von Zahlen und Zeichen zu unterstützen.
Das Iterieren über ganze Zahlen, Buchstaben, Zeitpunkte usw. erfordert oft eine spezielle Syntax und zuverlässige Unterstützung in der Standardbibliothek, sonst wird der Code unübersichtlich, schwer lesbar und anfällig für Fehler an den Grenzen.
In Kotlin gibt es Standardtypen wie IntRange, CharRange und LongRange sowie Progression für schrittweises Iterieren. Darüber hinaus können Bereiche für beliebige vergleichbare Typen definiert werden.
// Einfacher Bereich for (i in 1..5) print(i) // 12345 // Bereich mit Schritt for (i in 1..10 step 2) print(i) // 13579 // Umgekehrter Bereich for (i in 5 downTo 1) print(i) // 54321 // Eigener Bereich (z.B. für 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)
Wesentliche Merkmale:
.., downTo, until, stepWas ist der Unterschied zwischen dem Ausdruck 1..5 und 1 until 5?
1..5 umfasst beide Enden des Bereichs: 1,2,3,4,5. 1 until 5 schließt das letzte Element aus: 1,2,3,4.
Kann man einen Bereich mit einem Schritt von weniger als null mit step angeben?
Nein. Für abnehmende Bereiche verwenden Sie die Konstruktion downTo, dann step: 5 downTo 1 step 2 (Sie erhalten 5,3,1).
Kann man Bereiche mit Typen verwenden, die Comparable nicht implementieren?
Nein. Für die Erstellung eines Bereichs muss der Typ Vergleich unterstützen. Andernfalls wird der Compiler das Definieren nicht zulassen.
Im Code wurde anstelle von 1 until n+1 1..n verwendet. Wir erhalten ein zusätzliches Element, die Schleife geht über den zulässigen Bereich hinaus.
Vorteile:
Nachteile:
Es wird for (i in 0 until n) zur Indizierung eines Arrays der Länge n verwendet, der Bereich entspricht genau den zulässigen Indizes.
Vorteile:
Nachteile: