ProgramlamaBackend Geliştirici

Kotlin'da sayısal aralıkların mekanizmasını açıklayın: Range ve Progression nasıl çalışır, kendi aralıklarımızı nasıl oluşturabiliriz ve bunları hangi senaryolarda kullanmak uygundur?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

Sorunun Tarihi

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.

Sorun

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.

Çözüm

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:

  • Standart aralık sözdizimi: .., downTo, until, step
  • Sayısal, karakter, kullanıcı tanımlı türlerle çalışma
  • Döngülerde, üyelik kontrolünde, bölümlendirme, doğrulama uygulamaları

Kandırmaca Soruları.

1..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.

Tipik Hatalar ve Anti-Desenler

  • .. yerine until kullanımı ya da tersi, sınırların kapsayıcılığı ile karışıklık
  • Artan bir aralık için negatif adım atanma (step aralığı ters etmez)
  • Aralıkta kullanıcı tanımlı türler için Comparable gerekliliklerine uyulmaması

Gerçek Hayattan Bir Örnek

Olumsuz Durum

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:

  • İstemeden uc uç durumu yakalıyor

Eksiler:

  • Bölümlendirme hataları, sınırda yanlış toplam hesaplamaları

Olumlu Durum

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:

  • Dizi sınırının dışına çıkma hataları önleniyor
  • Okunabilirlik artırılıyor

Eksiler:

  • Diller arasında geçiş yaparken .. ve until arasındaki farkı hatırlamak gerekiyor