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

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

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

 

 

[第18回の様子]

2020/06/17に第18回を開催した。

 

参加メンバーは自分を含めて4人。引き続き、みんな在宅勤務中なので、それぞれオンラインミーティングルームに参加する形式で実施。今日も自分はVR参加はせず、自粛期間中に伸びきった冬毛のまま素顔で参加。良い加減冬毛をなんとかしないとな……。

 

勉強会本編の内容としては、Learn Kotlin by Exampleの第6章 Scope Functionnsのalso、第7章 DelegationのDelegation Patternの2節を進めた。

今回も、すべての動作確認をLearn Kotlin by Exampleのサイト上で実行できた(最後少し不安定だったが)。

 

[学んだことや疑問点]

  • also
    • Scope Functions5兄弟のラスト
    • 引数として渡す関数内ではitで元のオブジェクトにアクセスできる
    • 結局、applyとかとの違いはあまりよくわからず.....5つも似たような言語機能必要だったんだろうか
  • Delegation Pattern (by)
    • 自分含めメタラーがいたので、TomArayaクラスが登場して爆笑
    • インターフェース定義して、実装クラスを用意して、別の実装クラスで最初の実装クラスをbyで指定するとそちらに処理を移譲できる
    • class AwesomeClass() : AnInterface by AnImplementation
      という例だと、AwesomeClassからAnInterfaceのメソッドを呼び出す際に、実装クラスであるAnImplementationへの移譲が自動的に行われる。わざわざanImplementation.someMethod()みたいな冗長な実装を追加する必要はない。これは良い。
    • 実験として、2つのbyを書いたら良い感じに動いた。これはScope Functionsよりつかいみちがありそう。
interface SoundBehaviorA {
    fun makeSoundA()
}
interface SoundBehaviorB {
    fun makeSoundB()
}

class ScreamBehaviorA(val n:String): SoundBehaviorA {
    override fun makeSoundA() = println("${n.toUpperCase()} !!!")
}
class ScreamBehaviorB(val n:String): SoundBehaviorB {
    override fun makeSoundB() = println("${n.toLowerCase()} !!!")
}

// Tom Araya is the "singer" of Slayer
class TomAraya(n:String): SoundBehaviorA by ScreamBehaviorA(n),
  SoundBehaviorB by ScreamBehaviorB(n)

fun main() {
    val tomAraya = TomAraya("Thrash Metal")
    tomAraya.makeSoundA() // THRASH METAL !!!
    tomAraya.makeSoundB() // thrash metal !!!
}

 

[まとめ]

今回も、各節の最後に「やったー!」を実施できた。

次回も引き続きDelegationを学んでいくぞ!