今週は第31回を開催しました。
前回の様子はコチラ↓
[第31回の様子]
2020/09/17に第31回を開催した。
先週に引き続き時間帯を午後一に変更しての開催。しかも今週水曜日は私が終日ミーティングデーになってしまったので、泣く泣く木曜に移しての開催となった。
参加メンバーは自分をいれて6名。やはり前回とは2人ほどメンバーが入れ替わっている。毎回は参加できなくても、隔週でも継続的に参加してくれるメンバーがいるのはありがたい。そういえば今回は数ヶ月ぶりに参加してくれたメンバーもいた。
勉強会本編の内容としては、練習問題集Kotlin Koansの第4章 Propertiesの続きを進め、Lazy property
とDelegates example
の2つの問題を解いた。進捗は85%となり、前回比+5%。
[学んだことや疑問点]
- Lazy property
- lazyという名前のフィールドと、初期化のための関数が与えられて、(次の練習問題で使うから)Delegateを使うなという制約が。
- 方針として、以下のようなものを提案したが、
val lazy: Int
で不変だったため失敗
var initialized: Boolean = false val lazy: Int get() { if (!initialized) { // Error: Reassignment of read-only property via backing field field = initializer() initialized = true } return field }
- あるメンバーが
!!
を使うとNullableな型をNon-Nullableな型に変更できるからそれを使えばよい、と提案してくれて以下の形に落ち着いた。勉強になるなあ!
var v: Int? = null val lazy: Int get() { if (v == null) { v = initializer() } return v!! }
- Delegates example
- Delegated propertiesのページを読みつつ勉強。
- そういえばby〜で処理を移譲できたな、などと思い出す
- その中に遅延初期化を可能にするlazy()関数があるのでそれを使えばよいらしい。そういえば第19回で勉強したが、すっかり忘れていた。
- 最初は律儀に1番目の方法で実装したが、よく考えれば2番目でもいいのではと指摘してくれたメンバーがいて、実装がすっきりした。
- ラムダ式の扱いが異なるので、lazyの直後に来るのが
{
か(
かという微妙な違いがあるのに気づかず最初はコンパイルエラーになってしまった。無念。
// 1番目 class LazyProperty(val initializer: () -> Int) { val lazyValue: Int by lazy { initializer() } } // 2番目 class LazyProperty(val initializer: () -> Int) { val lazyValue: Int by lazy(initializer) }
[まとめ]
今回も引き続き練習問題集Kotlin Koansを進めた。
今回は2問解いて2回「やったー!」を実践できた!新しく学んだことも、復習して思い出したこともあって、どんどん身についており良い。
来週も引き続き第4章をやっていくぞ!