今週は第20回を開催しました。
前回の様子はコチラ↓
[第20回の様子]
2020/07/01に第20回を開催した。
参加メンバーは自分を含めて3人。だんだん参加者が減っているような……悲しい。
勉強会本編の内容としては、Learn Kotlin by Exampleの第7章 DelegationのDelegated Propertiesを最後までやり、第8章 Productivity BoostersのNamed Arguments、String Templatesの節まで進めた。
今回は、Learn Kotlin by ExampleのサイトのPlaygroundを利用してサンプルコードを実行したり、サンプルコードを変更して実験をしたりした。
[学んだことや疑問点]
- Delegated Properties: Standard Delegates
- 先週でてきた「blockingLazy」はググっても出てこないので、やはり古い仕様だろうという結論に。
- そもそもlazyがblockingっぽい。
- Delegated Properties: Storing Properties in a Map
- クラスのフィールドの値もMapなどに移譲できる
- 渡されるMapにクラスで定義されたキーがない場合は
java.util.NoSuchElementExceptionの例外が発生した - 反対に、Mapにキーが多い場合は特に例外は発生しなかった
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
fun main() {
val user = User(mapOf(
"age" to 25
))
println("name = ${user.name}, age = ${user.age}")
// Exception in thread "main" java.util.NoSuchElementException: Key age is missing in the map.
// at kotlin.collections.MapsKt__MapWithDefaultKt.getOrImplicitDefaultNullable (MapWithDefault.kt:24)
// at User.getAge (File.kt:-1)
// at FileKt.main (File.kt:11)
}
- Mapのバリューが
Any?だったのでnullが入るが、UserクラスのフィールドはStringなどnullableでない型だったので試しにnameにnullを入れたら動いてしまった。これはちょっと困るような...... - ちなみに
Int型のageに相当するmapの値がnullの場合はNullPointerExceptionが発生した
class User(val map: Map<String, Any?>) {
val name: String by map
val age: Int by map
}
fun main() {
val user = User(mapOf(
"name" to null,
"age" to 25
))
println("name = ${user.name}, age = ${user.age}, name is null: ${user.name == null}")
// name = null, age = 25, name is null: true
}
- Named Arguments
- String Templates
- これも散々過去の勉強会で登場している内容。
println("$someVariable")のように$+変数名でその変数の値を参照して出力できるprintln("${someVAriable == null}のように{}で囲んで式を書くこともできる
[まとめ]
今回は、前回実行できなかった「やったー!」を3回実行できた。やったー!
次回も引き続きProductivity Boostersを学んでいくぞ!