Stvaranje Kotlin Range Iteratora na prilagođenom objektu
1. Uvod
U prethodnom članku pokazali smo kako možemo stvoriti raspon u Kotlinu i kako je lako ponoviti ga Int, dugo i Char vrste.
Ali što ako to želimo ponovite preko prilagođenog tipa? Je li moguće? Odgovor je da! Pa krenimo u kod i vidimo kako.
2. Šareni tip
Zamislimo da imamo jednostavnu klasu koja predstavlja RGB boju:
klasa CustomColor (val rgb: Int): usporedivo {}
Bilo bi lijepo da možete ponoviti niz RGB boja:
val a = CustomColor (0x000000) val b = CustomColor (0xCCCCCC) za (cc u a..b) {// učiniti stvari}
3. Brzi uvid u IntRange
Jednostavno rečeno, morat ćemo provesti Usporedive, Iterativ, i ClosedRange. Iz našeg prethodnog članka već znamo da ćemo morati implementirati Usporedive.
Za ostala dva sučelja, zaronimo u IntRange izjava klase za neke savjete:
javna klasa IntRange (početak: Int, endInclusive: Int): IntProgression (start, endInclusive, 1), ClosedRange
I onda, IntProgressIzjava pokazuje da se provodi Može se probati:
javni otvoreni razred IntProgression: Iterable
Dakle, željet ćemo učiniti nešto slično da bi ovo uspjelo.
4. Raspon boja Razred
Kao IntRange, stvorimo a Raspon boja razred.
Za naše potrebe preskočit ćemo oponašanje IntProgress, također, budući da u redu je što imamo zadani korak 1. To će malo pojednostaviti stvari i omogućiti nam jednostavno provesti oboje ClosedRange i Iterativ direktno:
klasa ColorRange (nadjačati početak start: CustomColor, nadjačati val endInclusive: CustomColor): ClosedRange, Iterable {override fun iterator (): Iterator {return ColorIterator (start, endInclusive)}}
Za našu provedbu iterator (), vratit ćemo a ColorIterator klase koja će napraviti teško dizanje, zapravo prolazeći kroz domet.
Jer Raspon boja provodi ClosedRange
nadjačati zabavu compareTo (ostalo: CustomColor): Int {return this.rgb.compareTo (other.rgb)}
5. ColorIterator Razred
ColorIterator je zadnji komad slagalice:
klasa ColorIterator (val start: CustomColor, val endInclusive: CustomColor): Iterator {var initValue = start override fun hasNext (): Boolean {return initValue <= endInclusive} nadjačati zabavu next (): CustomColor {return initValue ++}}
Imajte na umu da initValue je tipa Prilagođena boja. Dakle, za mutiranje s ++ operatora, morat ćemo dodati uklj. () metoda za Prilagođena boja također:
operator fun inc (): CustomColor {return CustomColor (rgb + 1)}
6. Korištenje prilagođenog raspona
Skoro smo stigli!
Budući da definiramo svoj prilagođeni raspon, Prilagođena boja klasa mora implementirati dometTo metoda. The dometTo metoda omogućit će nam ponavljanje našeg raspona pomoću .. operater, nekako poput dodavanja uklj omogućuje nam upotrebu ++ operater.
Provjerimo konačni proizvod:
klasa CustomColor (val rgb: Int): Usporediv {nadjačati zabavu compareTo (drugo: CustomColor): Int {return this.rgb.compareTo (other.rgb)} operator zabave rangeTo (taj: CustomColor) = ColorRange (ovaj, taj) operator fun inc (): CustomColor {return CustomColor (rgb + 1)}}
I to je sve što trebamo!
Napokon, pogledajmo kako ovo sve skupa djeluje koristeći niz naših Prilagođena boja razred:
@Test zabava assertHas10Colors () {assertTrue {val a = CustomColor (1) val b = CustomColor (10) val range = a..b for (cc in range) {println (cc)} range.toList (). Size = = 10}}
U ovom smo testu definirali a domet varijabla i koristi se za iteraciju kroz Prilagođena boja objekata, kao i pretvoriti ga u popis.
Pogledajmo još jedan primjer korištenja standarda sadrži metoda na rasponu:
@Test zabava assertContains0xCCCCCC () {assertTrue {val a = CustomColor (0xBBBBBB) val b = CustomColor (0xDDDDDD) val range = a..b range.contens (CustomColor (0xCCCCCC))}}
7. Zaključak
Kotlin ima izvornu implementaciju asortimana za Int, dugo i Char vrijednosti. U ovom smo članku naučili kako implementirati raspon u prilagođenu klasu.
Kao i uvijek, kôd je dostupan na GitHubu.