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