今週は第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章をやっていくぞ!