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”。有没有更好的方法来做到这一点?还是仅仅是使用不可变列表的代价?

背景:该例程用于单元测试模拟类——返回类型已设置。

4

3 回答 3

7

Keystrokes如果列表不为空,则以下代码将为您获取列表的第一个元素,calculator.ui.IKey.No_Key否则:

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

PS 重新分配Keystrokes给尾部是糟糕设计的明确标志。相反,您应该在算法中使用主题提到的已经存在的列表迭代功能。最有可能使用诸如mapforeach将解决您的问题的方法。

PPS 您违反了几个Scala 命名约定

  • 变量、值、方法和函数名称以小写开头
  • camelCase用于分隔单词而不是下划线。事实上,出于这些目的使用下划线是非常不鼓励的,因为 Scala 对该特定字符进行了特殊处理
于 2012-08-21T07:00:34.227 回答
6

您正在实现一个Iteratoron a 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 回答