1

現在、これを使用してリストの最初の要素を選択します。

   def Get_Read_Key =
   {
      logger.entering (TAG, "Get_Read_Key")

      val Retval = if (Read_Key_Available)
      {
         val Retval = Keystrokes.head

         Keystrokes = Keystrokes.tail

         Retval
      }
      else
      {
         calculator.ui.IKey.No_Key
      } // if

      logger.exiting (TAG, "Get_Read_Key", Retval)
          Retval
   } // Get_Read_Key

   def Read_Key_Available = Keystrokes.size > 0

しかし、それはあらゆる種類の不器用に見えます - 特に二重の「Retval」です。これを行うより良い方法はありますか?それとも、不変リストを使用するために支払う代償に過ぎないのでしょうか?

背景: ルーチンは Unit Test Mock クラスで使用されます。戻り値の型が設定されています。

4

3 に答える 3

7

次のコードは、Keystrokesリストが空でない場合、リストの最初の要素を取得しますcalculator.ui.IKey.No_Key

Keystrokes.headOption.getOrElse( calculator.ui.IKey.No_Key )

PSKeystrokesテールへの再割り当ては、悪い設計の明確な兆候です。代わりに、テーマで言及されている、アルゴリズム内のリストの既存の反復機能を使用する必要があります。ほとんどの場合、mapまたはなどの方法を使用foreachすると、問題が解決します。

PPS いくつかのScala 命名規則に違反しています:

  • 変数、値、メソッド、および関数の名前は小文字で始まります
  • camelCaseアンダースコアの代わりに単語を区切るために使用されます。実際、これらの目的でアンダースコアを使用することは、Scala がその特定の文字を特別に扱うため、非常にお勧めできません。
于 2012-08-21T07:00:34.227 に答える
6

すでに標準ライブラリにある に をIterator実装しています。List

val it = Keystrokes.iterator
def Read_Key_Available = it.hasNext
def Get_Read_Key = if(it.hasNext) it.next() else calculator.ui.IKey.No_Key
于 2012-08-21T06:25:56.057 に答える
2

パターン マッチングを使用できます。

Keystrokes match {
  case h::t => 
    KeyStrokes = t
    h
  case _ => 
    calculator.ui.IKey.No_key
}
于 2012-08-21T06:21:56.553 に答える