LoginSignup
9
6

More than 5 years have passed since last update.

Kotlin Tips クイズ ~ 三項演算子風の処理 ~

Posted at

なんとなくうっかり間違えそうなところがあったので、クイズ風にまとめてみました。

始める前に

Kotlinをこれから勉強しよう or 勉強したてという人向けの簡単な問題です。
普段からKotlinを書いてる人からしたら、物足りないかもしれませんがご了承ください。

また、Kotlinの経験が浅い人向けに2点補足です。

null.toString()

KotlinではnullはAny?の拡張関数によりtoString()を呼び出せるようになっています。
リファレンス

そのためprintlnにnullを渡すと"null"が出力されます

Kotlinでのif文は式

Javaとは違いKotlinではif文は式になっています。そのため戻り値が取れます。
letやエルビス演算子(?:)でも同様です。
そのためKotlinには三項演算子はありません。(必要ないから)

fun main() {
    var str: String? = null
    var message: String? = null

    message = if (str != null) { "nullじゃないよ" } else { "nullだよ" }
    println(message)                // nullだよ

    str = "dummy"

    message = str?.let { "nullじゃないよ" }
    println(message)                // nullじゃないよ

    str = null

    message = str ?: "nullだよ"
    println(message)                // nullだよ
}

Question

では早速クイズに入っていきましょう!

それぞれ何が出力されるでしょうか?
答えをしっかりと考えてからPlay Groundで実行してみてください。

下へ進むと解説がありますので、先に読まないでくださいね。

Q1

fun main() {
    val q1 = "q1"
    println(if (q1 != null) { null } else { "default" })
}

Q2

fun main() {
    val q2 = null
    println(q2?.let { "let" } ?: "default")
}

Q3

fun main() {
    val q3 = null
    println(q3.let { it + it } ?: null)
}

Q4

fun main() {
    val q4 = "q4"
    println(q4?.let { null } ?: "default")
}

Answer

それではここから解説です。

A1:if文

fun main() {
    val q1 = "q1"
    println(if (q1 != null) { null } else { "default" })
}

これは簡単ですかね?
Javaなどでも三項演算子をif文で書いたらこんな感じになります。
q1はnullではないので先のif文が条件に一致します。
そのためnullが戻り値となるため nullと出力されます。

A2:エルビス演算子

fun main() {
    val q2 = null
    println(q2?.let { "let" } ?: "default")
}

これもそこまで悩むことはないと思います。
q2がnullなのでletは処理されず、後ろの?:によりdefaultが戻り値になります。
正解はdefaultです。

A3:引っ掛け+ 型推論

fun main() {
    val q3 = null
    println(q3.let { it + it } ?: null)
}

これもQ2と同じで簡単そうにみえますが、ちょっとした引っ掛けです。

ここでまず注意点はq3のletの前に?がないことです。
そのため、q3がnullかどうかは関係なく必ずletが実行されます。

そしてさらに次のポイントはit + itです。
三項演算子風の処理とは話が別になりますが、最初のitがnullなのでString?+オペレータの拡張関数により、String?と推論されます。(q3をInt?とかの型で明示的に宣言するとビルドが通らなくなります)
そして、次のitはAny?となり、String?+toString()で結合されるので、正解はnullnullです。

plusのリファレンス

A4:あまり気づかないパターン

fun main() {
    val q4 = "q4"
    println(q4?.let { null } ?: "default")
}

最後の問題です。
こんな簡単なのが最後なの?と思うかもしれませんが、割と勘違いしやすいやつです。

q4はnullではないのでletが処理されます。ですのでnullが返却されてnullと出力されそうですが、ここが違います。letの後にエルビス演算子が評価されます。
ですので、letの返却がnullのため、正解はdefaultになります。

まとめ

いかがでしたでしょうか?
意外とQ3, Q4あたりはうっかり間違えそうかなと思います。
何かの参考になれば幸いです。

クイズ風にはしてみましたが、他の問題も作るかはまだ考えてません。
何か、うっかり系や意外と知らなそうなものがあれば書いていきたいとは思っています。

9
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
6