Opprette en Kotlin Range Iterator på et tilpasset objekt

1. Introduksjon

I en tidligere artikkel viste vi hvordan vi kan lage et utvalg i Kotlin, og hvor enkelt det er å iterere over Int, lang og Char typer.

Men hva om vi vil gjentas over en tilpasset type? Er det mulig? Svaret er ja! Så la oss hoppe inn i koden og se hvordan.

2. En fargerik type

La oss forestille oss at vi har en enkel klasse som representerer en RGB-farge:

klasse CustomColor (val rgb: Int): Sammenlignelig {} 

Det ville være fint å kunne gjenta over en rekke RGB-farger:

val a = CustomColor (0x000000) val b = CustomColor (0xCCCCCC) for (cc i a..b) {// gjør ting}

3. En rask titt på IntRange

For å si det enkelt, vi må implementere Sammenlignelig, Iterabel, og ClosedRange. Fra vår forrige artikkel vet vi allerede at vi må implementere Sammenlignelig.

For de to andre grensesnittene, la oss dykke ned i IntRange klassedeklarasjon for noen tips:

offentlig klasse IntRange (start: Int, endInclusive: Int): IntProgression (start, endInclusive, 1), ClosedRange 

Og så, Introgresjon’Erklæring viser at den implementerer Iterabel:

offentlig åpen klasse IntProgression: Iterable

Så vi vil ønske å gjøre noe lignende for å få dette til å fungere.

4. Fargeskala Klasse

Som IntRange, la oss lage en Fargeskala klasse.

For våre formål hopper vi over å etterligne IntProgression, også siden vi har det bra med standard trinn 1. Dette vil forenkle ting litt og tillate oss å bare implementere begge deler ClosedRange og Iterabel direkte:

klasse ColorRange (overstyr val start: CustomColor, overstyr val endInclusive: CustomColor): ClosedRange, Iterable {override fun iterator (): Iterator {return ColorIterator (start, endInclusive)}}

For vår implementering av iterator (), returnerer vi a ColorIterator klasse som vil gjøre det tunge løftet å faktisk gå gjennom området.

Fordi Fargeskala implementerer ClosedRange grensesnitt, må vi implementere sammenligne med metode på CustomColor klasse:

overstyre moro CompareTo (annet: CustomColor): Int {return this.rgb.compareTo (other.rgb)}

5. ColorIterator Klasse

ColorIterator er den siste brikken av puslespillet:

klasse ColorIterator (val start: CustomColor, val endInclusive: CustomColor): Iterator {var initValue = start override fun hasNext (): Boolean {return initValue <= endInclusive} override fun next (): CustomColor {return initValue ++}}

Noter det initValue er av typen CustomColor. Så for å mutere det med ++ operatør, må vi legge til inc () metode til CustomColor også:

operator fun inc (): CustomColor {return CustomColor (rgb + 1)}

6. Bruke Custom Range

Vi er nesten der!

Siden vi definerer vårt tilpassede utvalg, CustomColor klassen må implementere rekkevidde til metode. De rekkevidde til metoden vil tillate oss å gjenta over vårt utvalg ved hjelp av .. operatør, som om hvordan du legger til inkl. mva tillater oss å bruke ++ operatør.

La oss sjekke ut det endelige produktet:

klasse CustomColor (val rgb: Int): Sammenlignbar {override fun comparTo (other: CustomColor): Int {return this.rgb.compareTo (other.rgb)} operator fun funTo (that: CustomColor) = ColorRange (this, that) operator fun inc (): CustomColor {return CustomColor (rgb + 1)}}

Og det er alt vi trenger!

Til slutt, la oss se hvordan alt dette fungerer sammen, av bruker en rekke av våre CustomColor klasse:

@Test fun assertHas10Colors () {assertTrue {val a = CustomColor (1) val b = CustomColor (10) val range = a..b for (cc in range) {println (cc)} range.toList (). Size = = 10}}

I denne testen har vi definert en område variabel og brukes til å gjenta gjennom CustomColor gjenstander, samt forvandle den til en liste.

La oss se et annet eksempel på bruk av standarden inneholder metode på rekkevidde:

@Test fun assertContains0xCCCCCC () {assertTrue {val a = CustomColor (0xBBBBBB) val b = CustomColor (0xDDDDDD) val range = a..b range.contains (CustomColor (0xCCCCCC))}}

7. Konklusjon

Kotlin har en innfødt implementering av rekkevidde for Int, lang og Char verdier. I denne artikkelen lærte vi hvordan vi implementerer et utvalg på en tilpasset klasse.

Som alltid er koden tilgjengelig på GitHub.


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