2017-02-01 9 views
3

Есть ли способ получить значение выражения, которое я передал в оператор when?Kotlin: Доступ к параметру when-statement

В моем приложении у меня есть 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) 
    } 
}) 

Имеет Котлин аккуратный синтаксис для доступа e?.keyCode? Я не хочу повторять это выражение.

+0

Настоящим ответом, к сожалению, является «нет». –

ответ

3

У меня была эта проблема сама пару дней назад. Я думаю, было бы неплохо иметь доступ к значению как it внутри выражения 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 будет оцениваться только один раз. В этом конкретном случае это не имеет значения, но если бы выражение было больше, этот подход был бы подходящим.

Edit:

Другая возможность это обернуть выражение 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) 
    } 
} 
+0

Который в этом случае превратит выражение OP в блок, что потребует дополнительных брекетов и линий. –

+0

Доступ к нему через 'it' тоже был моей первой идеей ... но, к сожалению, это невозможно (было бы здорово, если бы это было возможно). И как уже сказал Майкл, ваше решение превращает мое выражение в блок. – danielspaniol

+0

@MichaelPiefel Да, поэтому я сказал, что было бы неплохо, если бы мы могли получить доступ к нему с помощью 'it'. Эта возможность имеет одну цель, которая заключается в том, что 'e? .keyCode' будет оцениваться только один раз. В этом случае это может не повлиять, но если бы это было более выраженное выражение, я бы сказал, что это путь. – marstran

3

Вы можете попробовать следующее, даже если оно слегка изменяет семантику. Думаю, в вашем случае все может быть в порядке.

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

 Смежные вопросы

  • Нет связанных вопросов^_^