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