Kotlin:访问when语句的参数

有没有办法获得我传入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) } }) 

Kotlin有一个整洁的语法来访问e?.keyCode ? 我真的不想重复这个表达。

几天前我自己也有这个问题。 我认为能够在表达式中访问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只能评估一次。 在这种情况下可能并不重要,但如果表达更大,这种方法将是合适的。

编辑:

另一个可能性是它包装了when表达式。 它可以让你访问它的参数。 喜欢这个:

 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.1是不可能的。 这个功能有一个开放的功能请求: https : //youtrack.jetbrains.com/issue/KT-4895

即使稍微改变了语义,也可以尝试以下方法。 在你的情况下,我想可能是好的。

 _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) } } })