2017-02-27 11 views
2

Ich bin auf einer scala Aufgabe arbeiten, dies zu erreichen:Scala mit val als Gegen

Die observeCounter Funktion hat einen Parameter f: eine Funktion, die (eine Referenz auf) einen Zähler Instanz akzeptiert aber gibt nichts zurück. Die Funktion observeCounter sollte f mit (einem Verweis auf) einem Objekt (einer Klasse, die den Zähler erweitert) aufrufen. Ihre Klasse, die den Zähler erweitert, muss verfolgen, wie oft das Inkrement/Dekrement aufgerufen wurde. D. h., Wenn die increment-Methode dreimal für eine Instanz aufgerufen wird und die Dekrementmethode zweimal für dieselbe Instanz aufgerufen wird, sollte sie 5 speichern (irgendwo anders als das existierende Feld n). observeCounter sollte f aufrufen und dann die Gesamtzahl der Male zurückgeben, um die das Inkrement/Dekrement für die Instanz von f aufgerufen wurde.

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() 
} 

Eine der Anforderungen ist die Verwendung von val und nicht var. Ich habe keine Ahnung, wie ich das erreichen soll. Irgendwelche Vorschläge?

+0

Rekursion, bro. – Marcin

+2

Um welches Wissen geht es bei der Frage? Da Sie sich auf der JVM befinden, können Sie ganz einfach ein 'val total = new java.util.concurrent.atomic.AtomicInteger' verwenden und dann das mutieren, indem Sie z. 'AtomicInteger # incrementAndGet'. – Yawar

+0

Beachten Sie auch, dass vererbungsintensiver Code viel klarer ist, wenn Sie 'override' und' super' verwenden. – Yawar

Antwort

0

Sie haben zwei Möglichkeiten. Entweder Sie verwenden eine persistente unveränderliche, wobei f() eine aktualisierte Kopie des Counters zurückgibt, oder Sie verwenden eine veränderbare Datenstruktur, in der Sie var verwenden, oder verwenden Sie eine Problemumgehung, bei der Sie var mit einem einzelnen Elementarray oder ein AtomicInteger oder etwas ähnliches.

+0

"wo Sie var verwenden," OP besagt, dass dies nicht zulässig ist. –

1

Der einfachste Weg, den ich jetzt sehen, dies zu erreichen ist:

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 
} 
Verwandte Themen