Kotlin:何时声明的访问参数

dan*_*iol 8 syntax kotlin

有没有一种方法可以获取传递给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

我几天前就遇到了这个问题。我认为能够itwhen-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)


yol*_*ole 5

从 Kotlin 1.1 开始这是不可能的。此功能有一个开放的功能请求:https : //youtrack.jetbrains.com/issue/KT-4895