Можно ли создать настраиваемую структуру управления с несколькими блоками кода, как до {block1}, затем {block2}, наконец {block3}
? Вопрос только в части сахара - я знаю, что функциональность может быть легко достигнута путем передачи трех блоков методу, например doInSequence (block1, block2, block3)
.
Пример из реальной жизни. Для своих утилит тестирования я хотел бы создать такую структуру:
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)
}
Результат:
1
2
3
...
99
100
Average time: 10.23
Это в основном основано на ответе Томаса Локни , я просто добавил сопутствующий объект, чтобы иметь возможность ] import MyTimer ._
Всем спасибо, ребята.