kdnakt blog

hello there.

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

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

 

前回の様子はコチラ↓ 

kdnakt.hatenablog.com

 

 

[第10回の様子]

2020/04/08に第10回を開催した。

 

参加メンバーは自分を含めて9人。前回同様、みんなリモートワーク状態なので、それぞれオンラインミーティングルームに参加する形式で実施した。前回の4/1は年度がわりのシステムトラブルで参加できないメンバーもいたが、今回はそうしたトラブルも少なかったようだ。1ヶ月ぶりに参加したメンバーや、開催直前に勉強会に気づいて、初めて参加してくれたメンバーもいた。

 

今回は、その初めて参加してくれたメンバーにいきなりドライバを担当していただいた。Kotlinとか英語とか、どれくらい分かるだろうかとちょっと不安だったが、難なく独自実装を進めていって、コイツやるな……と思った。

 

内容としては、Learn Kotlin by Exampleの第4章 FunctionalのExtension Functions and Propertiesと、第5章 CollectionsのListを進めた。

大体節2つぶんずつ毎回コンスタントに進められていて良い。

 

例によって今回もVR参加した。じぶんはネコだしオオカミの参加者もいるしで何だか騒がしかった。オオカミの方は、参加していた別のメンバーの子供が画面を見て「オオカミだ、こわい」と泣きそうな声をぶつけられる一幕もあった。

f:id:kidani_a:20200409013354p:plainf:id:kidani_a:20200409013408p:plain

 

今週もサイト本体の調子が悪く、コードを動かすことができなかったので、動作確認にはPaizaにお世話になった。

paiza.io

 

[学んだことや疑問点]

  • Extension Functions and Properties
    • 拡張関数、拡張プロパティとでも訳すのだろうか
    • 拡張関数は以下のようにfun <Class>.extensionFunction()のように定義する
data class Item(val name: String, val price: Float)
data class Order(val items: Collection<item>)
fun Order.maxPricedItemValue(): Float = this.items.maxBy { it.price }?.price ?: 0F
    • エルビス演算子(:?)が出てきた、あまり馴染みがないけど三項演算子の仲間っぽいのは知っている
    • 本文中の例ではDataクラスを利用していたが、普通のクラスでも利用できる模様
    • 拡張プロパティの例は以下。Stringを返すgetterを宣言してる、みたいなイメージで良さそう。
val Order.commaDelimitedItemNames: String 
    get() = items.map { it.name }.joinToString() // A, B, C
    • null参照も拡張できるのはなんかJavaNullPointerExceptionに慣れた身からすると気持ち悪い。null.hoge()って……
fun <T> T?.nullSafeToString() = this?.toString() ?: "NULL"
fun main() {
    println(null.nullSafeToString()) // NULL
    println("Kotlin".nullSafeToString()) // Kotlin
}
  • List
    • 可変なmutableListOf()とそうでないlistOf()が組み込みで使えるのはこれまでにも見てきた通り
    • MutableList型をList型にキャストすることで不要な要素変更を(コンパイルエラーによって)避けることができる
val systemUsers: MutableList = mutableListOf(1, 2, 3)
val sudoers: List = systemUsers
sudoers.add(4) // error: unresolved reference: add
    • 早速、拡張関数とListを組み合わせて実装した(ついでに先週のLambda関数のit記法も)
val systemUsers: MutableList<Int> = mutableListOf(1, 2, 3)
val sudoers: List<Int> = systemUsers
fun <T> List<T>.printElements() {
    this.forEach { print(it) }
}
sudoers.printElements() // 123 
    • サードパーティのライブラリのクラスを拡張する時とかに使うと良さそう
    • ただ、JavaScriptのプロトタイプ汚染的な問題は気になったけど、多分スコープが限定されてるので大丈夫そう

 

[まとめ]

便利そうなExtension Functions、Extension Propertiesを学んだ。

来週はひたすらCollectionの続き!