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