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以来它是“是的”。看到被接受的答案,读到最后!