2016/12/16の30分 Kotlinメモ👌

2016/12/16の30分 Kotlinメモ👌

書いてるコードは雑にここにあります。

github.com

Kotlinスタートブック -新しいAndroidプログラミング が手元に届いたので、読み始めてる。

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング

Iterator

KotlinのIteratoriteratorメソッドを持つオブジェクトは、Iteratorを提供することになるらしい。

iteratorメソッドは、operator fun hasNext(): Booleanoperator fun next():Tを持つオブジェクトを返す必要がある。

何も実装なり継承なりしなくてよいと。これって要はduck typingなのかな?

class MyIterator {
    var i = 0
    operator fun hasNext(): Boolean = i++ < 5
    operator fun next(): String = "next"
}

class MyIterable {
    operator fun iterator() = MyIterator()
}

for (item in MyIterable()) {
    println(item)
}

Tail recursive functions

kotlinlang.org

再帰呼び出しの最適化の話。

KotlinはTCO(Tail Call Optimization)の仕組みがあるらしい。

末尾呼出し最適化とか言う場合もあるのかな?助けてウィキペディア先生!!

末尾再帰 - Wikipedia

再帰呼び出しってスタック積むやん、あれ最適化できるで!程度の理解でもういんじゃね?適当で。

とりあえず数値Listの合計を求める関数sumを作るとして、スタックさいならするコードが以下ですよーと。

うむ、どんどんスタック積まれていきますなー。

fun sumsum(numbers: List<Long>): Long = if (numbers.isEmpty()) 0 else numbers.first() + sum(numbers.drop(1))

sumsum((1L..10000000).toList())

んでKotlinでは「関数の最後の計算を再帰呼び出しにする」ことで、tailrec modifierが付けられると。

tailrecをつけることで、最適化されますよーってことらしい。なるほど。

んで書き直したのが以下。関数の最後がsum関数を呼び出すようになってる = 関数の最後の計算を再帰呼び出しにする になってますね。

tailrec fun sum(numbers: List<Long>, accumulator: Long = 0): Long = if (numbers.isEmpty()) accumulator else sum(numbers.drop(1), accumulator + numbers.first())

sum((1L..10000000).toList())

まとめ

Kotlin色々あるなー