I had this problem myself a couple of days ago. I think it would have been nice to be able to access the value as it
inside the when
-expression.
I solved it by assigning the expression to a val
before the when
expression:
val keyCode = e?.keyCode
when(keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keyCode)
}
不幸的是,这将需要您添加额外的花括号和线条.不过,好的一面是,e?.keyCode
只会被判断一次.在这种情况下,这可能无关紧要,但如果表达式更大,则此方法将是合适的.
Edit:
另一种可能是将when
表达式包装在对let
的调用中.它允许您使用it
访问参数.如下所示:
e?.keyCode.let {
when(it) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(it)
}
}
Edit2:
Kotlin 1.3 has support for capturing the subject expression of a when
in a variable. This is the syntax:
when(val keyCode = e?.keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keyCode)
}