今週は第18回を開催しました。
前回の様子はコチラ↓
[第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を学んでいくぞ!