Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用val作为计数器的Scala_Scala_Stateful - Fatal编程技术网

使用val作为计数器的Scala

使用val作为计数器的Scala,scala,stateful,Scala,Stateful,我正在执行一项scala任务,以完成以下任务: observeCounter函数有一个参数f:一个接受(对)计数器实例的引用但不返回任何内容的函数。 observeCounter函数应该使用(类扩展计数器的)对象(对对象的引用)调用f。 扩展计数器的类必须跟踪已调用递增/递减的总次数。 也就是说,如果在一个实例上调用增量方法3次,在同一个实例上调用减量方法2次,那么它应该存储5次(现有字段n之外的某个地方)。 observeCounter应该调用f,然后返回f对实例调用增量/减量的总次数 cla

我正在执行一项scala任务,以完成以下任务:

observeCounter函数有一个参数f:一个接受(对)计数器实例的引用但不返回任何内容的函数。 observeCounter函数应该使用(类扩展计数器的)对象(对对象的引用)调用f。 扩展计数器的类必须跟踪已调用递增/递减的总次数。 也就是说,如果在一个实例上调用增量方法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。我不知道如何做到这一点。有什么建议吗?

您有两个选择。您可以使用持久不可变(其中f()返回计数器的更新副本),也可以使用可变数据结构(其中使用var),或者使用变通方法(其中使用val将var包装为单元素数组或原子整数或类似内容)。

我现在看到的实现这一点的最简单方法是:

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
}

递归,兄弟。这个问题要你证明什么知识?因为假设您在JVM上,您可以很容易地使用
val total=new java.util.concurrent.atomic.AtomicInteger
,然后使用例如
AtomicInteger#incrementAndGet
对其进行变异。另外请注意,如果您在使用var的地方使用
覆盖
超级
,继承重的代码会更加清晰OP声明这是不允许的。