今週は第16回を開催しました。
前回の様子はコチラ↓
[第16回の様子]
2020/06/03に第16回を開催した。
参加メンバーは自分を含めて4人。引き続き、みんな在宅勤務中なので、それぞれオンラインミーティングルームに参加する形式で実施。今日は自分はVR参加はせず、自粛期間中に伸びきった冬毛のまま素顔で参加。
勉強会本編の内容としては、Learn Kotlin by Exampleの第6章 Scope Functionnsのlet、runの2節を進めた。
最後に、withの節のコードを実行しようとしたところで、Learn Kotlin by Exampleのサイト上でコードが実行できなくなってしまった。残念。
[学んだことや疑問点]
- let
letはスコープを限定したり、nullチェックをするのに利用される
fun print(str: String?) {
str?.let {
println(it)
}
}
print("hoge") // hoge
- 上の例で
str.let { ... }とする場合、itがnullになる可能性があるので、letスコープ内で自分でnullチェックをする必要がある - 最後の式の結果が戻り値になる(
returnは不要)
val empty = "test".let {
it.isEmpty()
}
println(" is empty: $empty") // is empty: false
- run
runもletと同様スコープを限定し、nullチェックをする- 最後の式の結果をreturnする点も同じ
- 異なる点として、
runスコープ内ではitなしで、元のオブジェクトのメンバーをthisとして直接アクセス可能
"test".run {
println("$length") // 4
}
- Delphi (Pascal)やVisual Basicの
withでも似たようなことができるが、入れ子にするとthisが何を指しているか分かりづらくなるので注意が必要、と参加者からコメントがあった - Kotlinの場合、一番近い
thisを指すような動作をしていた
"test".run {
println("$length") // 4
"sample".run {
println("$length") // 6
}
}
本筋とは関係ないが、サンプルコードで以下のような関数が定義されていた。
fun getNullableLength(ns: String?) {
println("input: \"$ns\":")
// 省略
}
getNullableLength(null)
この関数の戻り値が気になったので、以下のように書き換えて実行してみた。
fun getNullableLength(ns: String?) {
println("input \"$ns\":")
// 省略
}
val res = getNullableLength(null)
println(res) // kotlin.Unit
すると、kotlin.Unitという謎の出力が得られた。
公式サイトの説明によれば、Javaでいうvoidと同じらしい。なるほど。Javaを普段使いしている身からするとvoidならコンパイルエラーになりそうな気もするけど、KotlinのUnitはそうじゃないんだな。面白い。
[まとめ]
今回も、各節の最後に「やったー!」を実施できた。
次回も引き続きScope Functionsを学んでいくぞ!