kdnakt blog

hello there.

会社でKotlin勉強会(第31回)を開催した

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

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第31回の様子]

2020/09/17に第31回を開催した。

 

先週に引き続き時間帯を午後一に変更しての開催。しかも今週水曜日は私が終日ミーティングデーになってしまったので、泣く泣く木曜に移しての開催となった。

参加メンバーは自分をいれて6名。やはり前回とは2人ほどメンバーが入れ替わっている。毎回は参加できなくても、隔週でも継続的に参加してくれるメンバーがいるのはありがたい。そういえば今回は数ヶ月ぶりに参加してくれたメンバーもいた。

 

勉強会本編の内容としては、練習問題集Kotlin Koansの第4章 Propertiesの続きを進め、Lazy propertyDelegates 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章をやっていくぞ!