Syntax Kotlin:访问when语句的参数
有没有一种方法可以获取我在Syntax Kotlin:访问when语句的参数,syntax,kotlin,Syntax,Kotlin,有没有一种方法可以获取我在when语句中传递的表达式的值 在我的应用程序中,我有一个这样的keylister _content.addKeyListener(object : KeyAdapter() { override fun keyPressed(e: KeyEvent?) = when(e?.keyCode) { KeyEvent.VK_T -> mainWindow.enterTrainingState() KeyEvent.VK_P -&
when
语句中传递的表达式的值
在我的应用程序中,我有一个这样的keylister
_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)
}
})
Kotlin是否有简洁的语法来访问
e?.keyCode
?我真的不想重复这个表达式。几天前我自己也有这个问题。我认为如果能够在when
-表达式中访问中的it
值会很好
我通过在when
表达式之前将表达式指定给val
解决了这个问题:
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
只能计算一次。在这种情况下,这可能无关紧要,但如果表达式更大,这种方法将是合适的
编辑:
另一种可能是在调用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支持在变量中捕获的主题表达式。以下是语法:
when(val keyCode = e?.keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keyCode)
}
从Kotlin 1.1开始这是不可能的。此功能有一个开放的功能请求:您可以尝试以下操作,即使它稍微改变了语义。对你来说,我想可能没问题
_content.addKeyListener(object : KeyAdapter() {
override fun keyPressed(e: KeyEvent?) = e?.keyCode.let {
when(it) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(it)
}
}
})
使用Kotlin 1.3,可以将参数设置为作用域变量并访问它
_content.addKeyListener(object : KeyAdapter() {
override fun keyPressed(e: KeyEvent?) = when(val keycode = e?.keyCode) {
KeyEvent.VK_T -> mainWindow.enterTrainingState()
KeyEvent.VK_P -> mainWindow.enterPlayState()
KeyEvent.VK_E -> mainWindow.close()
else -> println(keycode)
}
})
在本例中,这将把OP的表达式变成一个块,因此需要额外的大括号和行。通过it
访问它也是我的第一个想法。。。但遗憾的是,这是不可能的(如果可能的话,那就太酷了)。正如Michael已经提到的,您的解决方案将我的表达式转换为块。@MichaelPiefel是的,这就是为什么我说如果我们可以使用it
访问它会很好。这种可能性有一个目的,那就是e?.keyCode
只会被评估一次。在这种情况下可能没什么区别,但如果这是一个更大的表达,我会说这是一条路。@Exhuzt查看我的编辑,看看你是否觉得这更好。@Exhuzt我想知道是什么让这个答案比我的好这么多…我阅读了上面的评论和接受答案的开头,得出结论认为这是不可能的,但自Kotlin 1.3以来它是“是的”。看到被接受的答案,读到最后!