Ist es möglich, eine benutzerdefinierte Kontrollstruktur mit mehreren Codeblöcken in der Art von before { block1 } then { block2 } finally { block3 }
zu erstellen? Die Frage betrifft nur den Zuckerteil - ich weiß, dass die Funktionalität leicht erreicht werden kann, indem man die drei Blöcke an eine Methode wie doInSequence(block1, block2, block3)
übergibt.Scala: Benutzerdefinierte Kontrollstrukturen mit mehreren Codeblöcken
Ein Beispiel aus dem wirklichen Leben. Für meine Tests Dienstprogramme würde Ich mag eine Struktur wie diese erstellen:
getTime(1000) {
// Stuff I want to repeat 1000 times.
} after { (n, t) =>
println("Average time: " + t/n)
}
EDIT:
object MyTimer {
def getTime(count: Int)(action : => Unit): MyTimer = {
val start = System.currentTimeMillis()
for(i <- 1 to count) { action }
val time = System.currentTimeMillis() - start
new MyTimer(count, time)
}
}
class MyTimer(val count: Int, val time: Long) {
def after(action: (Int, Long) => Unit) = {
action(count, time)
}
}
// Test
import MyTimer._
var i = 1
getTime(100) {
println(i)
i += 1
Thread.sleep(10)
} after { (n, t) =>
println("Average time: " + t.toDouble/n)
}
Der Ausgang ist:
Schließlich ich mit dieser Lösung kam
1
2
3
...
99
100
Average time: 10.23
Es basiert meist auf der Antwort von Thomas Lockney, Ich habe gerade das begleitende Objekt hinzugefügt, um import MyTimer._
Vielen Dank, Jungs.
Das ist peinlich einfach :). Vielen Dank –