2017-02-27 40 views
2

我工作的一階任務來實現:斯卡拉使用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

回答

0

您有兩種選擇。要麼使用持久化不可變,其中f()返回計數器的更新副本,或者使用可變數據結構(使用var的地方),或者在使用val將var包裝爲單個元素數組的情況下使用變通方法,或者一個AtomicInteger或類似的東西。我現在看實現這一

+0

「你使用var的地方」,OP聲明這是不允許的。 –

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 
}