Scala使用val作为计数器

时间:2017-02-27 22:48:48

标签: scala stateful

我正在进行scala任务来完成此任务:

observeCounter函数有一个参数f:一个接受(引用)Counter实例但什么都不返回的函数。 observeCounter函数应该使用(引用)对象(扩展Counter的类)来调用f。 扩展Counter的类必须跟踪调用增量/减量的总次数。 即,如果在实例上调用增量方法3次,并且在同一实例上调用减量方法2次,那么它应该存储5(除了现有字段n之外的某处)。 observeCounter应该调用f,然后返回f对实例调用增量/减量的总次数。

class myCounter extends Counter {
 val total = 0
 def increment () = {increment(); total = total + 1;}
 def decrement () = {decrement(); total = total + 1;}
 def get() : Int = total 
}


def observeCounter (f : Counter => Unit) : Int = {
 val o1 = new myCounter() 
 f(o1)
 o1.get()
}

其中一个要求是使用val而不是var。我不知道如何实现这一目标。有什么建议吗?

2 个答案:

答案 0 :(得分:1)

我现在看到的最简单的方法是:

class myCounter extends Counter{

  object counter{
    var count = 0
  }

  val total = counter
  def increment () = {super.increment(); total.count+=1}
  def decrement () = {super.decrement(); total.count-=1;}
  def get() : Int = total.count
}

答案 1 :(得分:0)

您有两种选择。您可以使用持久不可变,其中f()返回Counter的更新副本,或者使用可变数据结构(使用var),或使用变量来解决使用val来使用单个元素数组包装var或一个AtomicInteger或类似的东西。