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 == ... }
はどちらか一方を使うこと。両方を同時に使わない。
とあった。
なるほど。