kotlin-puzzlersのnaughtyWhen問題

Twitterで#KotlinConf18jpのハッシュタグを眺めてたら次のような問題が流れてきた。

package syntax.naughtyWhen
// by Ilya Gorbunov

fun f(x: Boolean) {
   when(x) {
       x == true -> println("$x TRUE")
       x == false -> println("$x FALSE")
   }
}

f(true)
f(false)

// What will it print?
// a) true TRUE; false FALSE
// b) true TRUE; false TRUE
// c) true FALSE; false FALSE
// d) none of the above

この問題の正解はbになる。Kotlin Playgroundで試してみた結果はこちら。

何故その結果になるのか疑問に思って調べるとGiHubで問題と解説が公開されていた。

kotlin-puzzlers/src/syntax/naughtyWhen at master · angryziber/kotlin-puzzlers · GitHub

when式でfalseを渡すと実際には次のように評価されるのが理由で正解がbになる。

when(x) {
    x == true -> println("$x TRUE") // 実際にはfalse == x == trueとなる。xにはfalseが入るためtrueと判定される。
}

なるほど。そして解説には

when(x)when { x == ... } はどちらか一方を使うこと。両方を同時に使わない。

とあった。

なるほど。

参考