Kotlin'de en başından beri ardışık değer kümeleri ile işlemleri basitleştirmek için aralıklar (Range) tanıtıldı — bu, sayılarla çalışırken kısayol sözdizimi olan dillerden (örneğin, Python) miras alınmıştır. Ayrıca, Range mekanizması Progression'a genişletilmiştir, bu da tekrar adım boyutunu belirlemeye ve farklı sayılar, karakterler desteklemeye olanak tanır.
Tam sayılar, harfler, zaman noktaları vb. üzerinde yineleme yapmak çoğu zaman özel sözdizimi ve standart kütüphanede güvenilir destek gerektirir, aksi takdirde kod karmaşık, okunaksız hale gelir ve sınır hatalarına eğilim gösterir.
Kotlin'de IntRange, CharRange ve LongRange gibi standart türler ve ayrıca adımlı yineleme için Progression vardır. Ayrıca, karşılaştırılabilir türler için aralıklar tanımlamak da mümkündür.
// Basit bir aralık for (i in 1..5) print(i) // 12345 // Adım olan bir aralık for (i in 1..10 step 2) print(i) // 13579 // Ters aralık for (i in 5 downTo 1) print(i) // 54321 // Kendi aralığımız (örneğin, Version için) 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)
Anahtar özellikler:
.., downTo, until, step1..5 ifadesi ile 1 until 5 arasındaki fark nedir?
1..5 her iki ucu da içerir: 1,2,3,4,5. 1 until 5 son öğeyi içermez: 1,2,3,4.
Adımı negatif olan bir aralık tanımlamak için step kullanabilir miyiz?
Hayır. Azalan aralıklar için downTo yapısını kullanın, sonra step: 5 downTo 1 step 2 (5,3,1 elde edersiniz).
Comparable'ı uygulamayan türlerle aralıklar kullanabilir miyim?
Hayır. Bir aralık oluşturmak için türün karşılaştırma desteğine sahip olması gereklidir. Aksi takdirde, derleyici tanımayı engeller.
Kodda 1 until n+1 yerine 1..n kullanıldı. Fazladan bir öğe alıyoruz, döngü geçerli aralığın dışına çıkıyor.
Artılar:
Eksiler:
Dizinin uzunluğu n olan dizinin endekslenmesi için for (i in 0 until n) kullanılıyor, aralık kesinlikle geçerli indeks değerleri ile örtüşüyor.
Artılar:
Eksiler: