2017-02-01 2 views
3

Gibt es einen Weg, um den Wert des Ausdrucks erhalten ich in die when Anweisung übergeben?Kotlin: Zugriff auf Parameter von when-Anweisung

In meiner Anwendung habe ich eine KeyListener wie die

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

Hat Kotlin eine saubere Syntax e?.keyCode zugreifen? Ich möchte den Ausdruck nicht wirklich wiederholen.

+0

Die wirkliche Antwort ist leider "Nein". –

Antwort

3

hatte ich dieses Problem selbst ein paar Tage. Ich denke, es wäre schön gewesen, auf den Wert als it innerhalb des when -ausdrucks zugreifen zu können.

Ich löste es durch den Ausdruck zu einem val vor dem when Ausdruck zuweisen:

val keyCode = e?.keyCode 
when(keyCode) { 
    KeyEvent.VK_T -> mainWindow.enterTrainingState() 
    KeyEvent.VK_P -> mainWindow.enterPlayState() 
    KeyEvent.VK_E -> mainWindow.close() 
    else -> println(keyCode) 
} 

Leider ist dies Sie zusätzliche Klammern und Linien hinzuzufügen, erfordern würde. Der Vorteil ist, dass e?.keyCode nur einmal ausgewertet wird. Es mag in diesem genauen Fall keine Rolle spielen, aber wenn der Ausdruck größer wäre, wäre dieser Ansatz geeignet.

Edit:

Eine weitere Möglichkeit den when Ausdruck in einem Aufruf von let zu wickeln. Sie können auf den Parameter mit it zugreifen. Wie folgt:

e?.keyCode.let { 
    when(it) { 
     KeyEvent.VK_T -> mainWindow.enterTrainingState() 
     KeyEvent.VK_P -> mainWindow.enterPlayState() 
     KeyEvent.VK_E -> mainWindow.close() 
     else -> println(it) 
    } 
} 
+0

In diesem Fall wird der Ausdruck des OP in einen Block umgewandelt, wodurch zusätzliche Klammern und Linien erforderlich sind. –

+0

Der Zugang über 'it' war meine erste Idee auch ... aber leider ist es nicht möglich (wäre cool wenn es möglich wäre). Und wie Michael bereits erwähnt hat, konvertiert Ihre Lösung meinen Ausdruck in einen Block. – danielspaniol

+0

@MichaelPiefel Ja, deshalb habe ich gesagt, es wäre schön, wenn wir mit 'it' darauf zugreifen könnten. Diese Möglichkeit hat einen Zweck, nämlich dass "e? .keyCode" nur einmal ausgewertet wird. Es mag in diesem Fall keinen Unterschied machen, aber wenn es ein größerer Ausdruck wäre, würde ich sagen, dass dies der richtige Weg ist. – marstran

3

Sie können Folgendes versuchen, auch wenn es die Semantik geringfügig ändert. In deinem Fall kann es gut sein, denke ich.

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