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

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

 

前回の様子はコチラ↓

kdnakt.hatenablog.com

  

 

[第16回の様子]

2020/06/03に第16回を開催した。

 

参加メンバーは自分を含めて4人。引き続き、みんな在宅勤務中なので、それぞれオンラインミーティングルームに参加する形式で実施。今日は自分はVR参加はせず、自粛期間中に伸びきった冬毛のまま素顔で参加。

 

勉強会本編の内容としては、Learn Kotlin by Exampleの第6章 Scope Functionnsのletrunの2節を進めた。

最後に、withの節のコードを実行しようとしたところで、Learn Kotlin by Exampleのサイト上でコードが実行できなくなってしまった。残念。

 

[学んだことや疑問点]

  • let
    • letはスコープを限定したり、nullチェックをするのに利用される
fun print(str: String?) {
    str?.let {
        println(it)
    }
}
print("hoge") // hoge 
    • 上の例でstr.let { ... }とする場合、itnullになる可能性があるので、letスコープ内で自分でnullチェックをする必要がある
    • 最後の式の結果が戻り値になる(returnは不要)
val empty = "test".let {
    it.isEmpty()
}
println(" is empty: $empty") // is empty: false
  • run
    • runletと同様スコープを限定し、nullチェックをする
    • 最後の式の結果をreturnする点も同じ
    • 異なる点として、runスコープ内ではitなしで、元のオブジェクトのメンバーをthisとして直接アクセス可能
"test".run {
    println("$length") // 4
}
    • Delphi (Pascal)やVisual Basicwithでも似たようなことができるが、入れ子にすると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を学んでいくぞ!