¿Es posible crear una estructura de control personalizada con varios bloques de código, a la manera de before { block1 } then { block2 } finally { block3 }
? La pregunta es sobre la parte de azúcar solamente: sé que la funcionalidad se puede lograr fácilmente pasando los tres bloques a un método, como doInSequence(block1, block2, block3)
.Scala: estructuras de control personalizadas con varios bloques de código
Un ejemplo de la vida real. Para mis utilidades de prueba que me gustaría crear una estructura como esta:
getTime(1000) {
// Stuff I want to repeat 1000 times.
} after { (n, t) =>
println("Average time: " + t/n)
}
EDITAR:
Finalmente se me ocurrió con esta solución:
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)
}
La salida es:
1
2
3
...
99
100
Average time: 10.23
Se basa principalmente en la respuesta por Thomas Lockney, acabo de agregar el objeto complementario para poder import MyTimer._
Gracias a todos, muchachos.
Eso es embarazosamente simple :). Gracias –