2017-02-01 9 views
3

when文に渡された式の値を取得する方法はありますか?私のアプリケーションでKotlin:when文のパラメータへのアクセス

は私がきちんと構文がe?.keyCodeをKotlinアクセスするためにしたこと

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

のようなKeyListenerがありますか?私は本当に表現を繰り返す必要はありません。

+0

本当の答えは、残念ながら「いいえ」です。 –

答えて

3

私は数日前にこの問題を抱えていました。 when -expressionの中の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は一度だけ評価されるということです。この正確なケースでは問題にはならないかもしれませんが、表現がもっと大きければ、このアプローチが適しています。

編集:それはletへの呼び出しでwhen式をラップする

別の可能性。これにより、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) 
     } 
    } 
}) 
関連する問題