斯卡拉使用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。我不知道如何做到这一点。有什么建议么?
答
您有两种选择。要么使用持久化不可变,其中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
}
递归,兄弟。 – Marcin
什么知识是要求您演示的问题?因为假设你在JVM上,你可以很容易地使用'val total = new java.util.concurrent.atomic.AtomicInteger',然后使用例如'的AtomicInteger#incrementAndGet'。 – Yawar
还要注意,如果使用'override'和'super',继承繁重的代码会更清晰。 – Yawar