[毎日Kotlin] Day22. Conventions

2018.02.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

毎日Kotlinシリーズです。

このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました

Conventionsの章について

この章ではOperator(演算子)がテーマの問題でした。毎日自分だけのオレオレ演算子ルールを作り、シンプルな演算子を組み合わせて他の演算子を実現したりしました。ハイライトで見ていきます。

Day 15-18のハイライト

Dateをテーマにしてましたが、ここで同様のOperatorをもっとシンプルなNumというIntをラップしただけのものでやってみます。

class Num(val value: Int)

Day15 - Day18までの一連の流れをつかむとオレオレ演算子ルールを作りやすくなるので何度か自分でつくってみよう。Day19は少し複雑になっていますが、流れは同じです。Day20とDay21は便利機能なので覚えておくと良いと思います。

各演算子毎にそれを処理するクラスをつくり、そのクラスに変換する流れになっています。

fun main() {
    val a = Num(1)
    val b = Num(10)
    a > b //day15で実現
    Num(3) in NumRange(a, b) //day16で実現
    Num(3) in a..b //day17で実現
    for (num in a..b) { //day18で実現
    }
}

class Num(val value: Int) {
    //Day15で実装
    operator fun compareTo(b: Num): Int = b.value - value

    //Day17で実装
    operator fun rangeTo(num: Num) = NumRange(this, num)
}

class NumRange(val start: Num, val end: Num) {
    //Day18で実装
    operator fun iterator(): Iterator<Num> = NumIterator(this)

    //Day16で実装
    operator fun contains(num: Num): Boolean = start <= num && num <= end
}

//Day18で実装
class NumIterator(val range: NumRange) : Iterator<Num> {
    var current = range.start

    override fun hasNext(): Boolean = current <= range.end

    override fun next(): Num {
        val result = current
        current = current.next()
        return result
    }

    private fun Num.next(): Num = Num(value + 1)
}

あとがき

毎日やっている方はこうなっていることでしょう。

明日からはコレクションの章にはいっていきます!

Day23.でまたお会いしましょう。