会社でKotlin勉強会あらためKotlin dojo(第34回)を開催した

今週は第34回を開催しました。

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第34回の様子]

2020/10/07に第34回を開催した。

会社のカレンダーに登録されたイベント名を「Kotlin勉強会」から「Kotlin dojo」に変更して2回目の開催である。

 

参加メンバーは自分をいれて2名。……最初の15分は、誰も来てくれなかったので1人でオンラインMTGに参加して、黙々と問題を解いていた。後から1人来てくれて、自分が解いた問題についてああだこうだ話して、新しい視点を得ることができた。やはり1人より2人の方が良い。

 

勉強会本編の内容としては、練習問題集Kotlin Koansの第5章 Buildersを継続して、String and map buildersを解いた。進捗は93%となり、前回比+3%。残り10%を切って、いよいよ終わりが見えてきた!

 

[学んだことや疑問点]

  • String and map builders
    • 前回のFunction literals with receiverの内容の復習といった感じの内容で、レシーバーに拡張関数を生やす問題。
    • StringBuilderに拡張関数を生やすbuildString関数のサンプルを見ながら、buildMutableMapを実装するという内容。
    • 最初は以下のように実装したら、Unresolved reference: putというコンパイルエラーになってしまった。
import java.util.HashMap

// start
fun buildMutableMap(build: Map<Int, String>.() -> Unit): Map<Int, String> {
    val map = HashMap<Int, String>()
    map.build()
    return map
}
// end

fun usage(): Map<Int, String> {
    return buildMutableMap {
        put(0, "0") // コンパイルエラー
        for (i in 1..10) {
            put(i, "$i") // コンパイルエラー
        }
    }
}
    • よくわからなかったので、build関数のレシーバーをMapからHashMapに変更したら、コンパイルもテストも通った
    • Mapはインターフェースだから拡張関数を追加できないとかあるんだろうか……?この辺はよくわからず。Map型にputメソッドは定義されているからコンパイルエラーにはならないと思うのだが……。
    • とりあえず問題は解けたので解答を見て答えあわせをしたら、ジェネリクスを使って以下の様に書くべしとあった。確かに。
fun <K, V> buildMutableMap(build: HashMap<K, V>.() -> Unit): Map<K, V> {
    val map = HashMap<K, V>()
    map.build()
    return map
}
    • やっぱり、型.()のあたりとか<K, V>.()のあたりがなんとなく違和感がある……慣れが足りないのだろうか。

 

[まとめ]

今回も引き続き練習問題集Kotlin Koansを進めた。

今回は1人で、静かに「やったー!」を実践した。

後少しでKoansも終わりなので楽しく学んでいくぞ!!