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?
Rekursion, bro. – Marcin
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
Beachten Sie auch, dass vererbungsintensiver Code viel klarer ist, wenn Sie 'override' und' super' verwenden. – Yawar