有没有一种方法可以获取传递给when语句的表达式的值?
在我的应用程序中,我有一个KeyListener类似的
_content.addKeyListener(object : KeyAdapter() {
override fun keyPressed(e: KeyEvent?) = when(e?.keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(e?.keyCode)
}
})
Run Code Online (Sandbox Code Playgroud)
Kotlin是否可以使用整洁的语法e?.keyCode?我真的不想重复这种表达。
mar*_*ran 10
我几天前就遇到了这个问题。我认为能够it在when-expression中访问该值会很好。
我通过将表达式分配给表达式val之前的来解决了这个问题when:
val keyCode = e?.keyCode
when(keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keyCode)
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,这将需要您添加额外的花括号和行。不过,这样做的好处是e?.keyCode只能被评估一次。在这种情况下可能并不重要,但是如果表达式更大,则此方法将是合适的。
编辑:
另一种可能是将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)
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2:
Kotlin 1.3支持捕获when变量中a 的主题表达。这是语法:
when(val keyCode = e?.keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keyCode)
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
784 次 |
| 最近记录: |