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 sučelje, moramo implementirati usporediTo metoda na Prilagođena boja razred:

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.


$config[zx-auto] not found$config[zx-overlay] not found