斯卡拉使用VAL作为计数器

问题描述:

我工作的一阶任务来实现:斯卡拉使用VAL作为计数器

的observeCounter函数有一个参数f:接受(参考到)一个计数器实例,但没有返回值的函数。 observeCounter函数应该调用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。我不知道如何做到这一点。有什么建议么?

+0

递归,兄弟。 – Marcin

+2

什么知识是要求您演示的问题?因为假设你在JVM上,你可以很容易地使用'val total = new java.util.concurrent.atomic.AtomicInteger',然后使用例如'的AtomicInteger#incrementAndGet'。 – Yawar

+0

还要注意,如果使用'override'和'super',继承繁重的代码会更清晰。 – Yawar

您有两种选择。要么使用持久化不可变,其中f()返回计数器的更新副本,或者使用可变数据结构(使用var的地方),或者在使用val将var包装为单个元素数组的情况下使用变通方法,或者一个AtomicInteger或类似的东西。我现在看实现这一

+0

“你使用var的地方”,OP声明这是不允许的。 –

最简单的方法是:

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 
}