Kotlin: доступ к параметру when-statement

Есть ли способ получить значение выражения, которое я передал в оператор 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 ? Я не хочу повторять это выражение.

У меня была эта проблема сама пару дней назад. Я думаю, было бы неплохо иметь доступ к значению, как внутри внутри, так и when выражении.

Я решил это, назначив выражение 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) } 

К сожалению, для этого потребуется добавить дополнительные фигурные скобки и линии. Однако, несмотря на это, e?.keyCode будет оцениваться только один раз. В этом конкретном случае это не имеет значения, но если бы выражение было больше, этот подход был бы подходящим.

Редактировать:

Еще одна возможность его обернуть, when выражение в вызове let . Он позволяет вам получить доступ к этому параметру. Как это:

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