È possibile creare una struttura di controllo personalizzata con diversi blocchi di codice, nel modo di before { block1 } then { block2 } finally { block3 }
? La domanda riguarda solo la parte zucchero - So che la funzionalità può essere facilmente ottenuta passando i tre blocchi a un metodo, come doInSequence(block1, block2, block3)
.Scala: strutture di controllo personalizzate con diversi blocchi di codice
Un esempio di vita reale. Per i miei programmi di utilità di test mi piacerebbe creare una struttura come questa:
getTime(1000) {
// Stuff I want to repeat 1000 times.
} after { (n, t) =>
println("Average time: " + t/n)
}
EDIT:
Infine mi si avvicinò con questa soluzione:
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)
}
L'output è:
1
2
3
...
99
100
Average time: 10.23
Si basa principalmente sulla risposta di Thomas Lockney, ho appena aggiunto l'oggetto associato di poter import MyTimer._
Grazie a tutti, ragazzi.
Questo è imbarazzante semplice :). Grazie –