2016/12/16の30分 Kotlinメモ👌
2016/12/16の30分 Kotlinメモ👌
書いてるコードは雑にここにあります。
Kotlinスタートブック -新しいAndroidプログラミング が手元に届いたので、読み始めてる。
Kotlinスタートブック -新しいAndroidプログラミング
- 作者: 長澤太郎
- 出版社/メーカー: リックテレコム
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Iterator
KotlinのIteratorはiterator
メソッドを持つオブジェクトは、Iteratorを提供することになるらしい。
iterator
メソッドは、operator fun hasNext(): Boolean
とoperator 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
再帰呼び出しの最適化の話。
KotlinはTCO(Tail Call Optimization)の仕組みがあるらしい。
末尾呼出し最適化とか言う場合もあるのかな?助けてウィキペディア先生!!
再帰呼び出しってスタック積むやん、あれ最適化できるで!程度の理解でもういんじゃね?適当で。
とりあえず数値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色々あるなー