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