今週は第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を学んでいくぞ!