この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
はじめに
毎日Kotlinシリーズです。
このシリーズを初めての方はこちらです。「毎日Kotlin」はじめました
Conventionsの章について
この章ではOperator(演算子)がテーマの問題でした。毎日自分だけのオレオレ演算子ルールを作り、シンプルな演算子を組み合わせて他の演算子を実現したりしました。ハイライトで見ていきます。
- [毎日Kotlin] Day15. Comparison(演算子)
- [毎日Kotlin] Day16. In range
- [毎日Kotlin] Day17. Range to
- [毎日Kotlin] Day18. For loop(ループ処理)
- [毎日Kotlin] Day19. Operators overloading
- [毎日Kotlin] Day20. Destructuring declarations
- [毎日Kotlin] Day21. Invoke
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.でまたお会いしましょう。