Scala: настраиваемые управляющие структуры с несколькими блоками кода

Можно ли создать настраиваемую структуру управления с несколькими блоками кода, как до {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 ._

Всем спасибо, ребята.

6
задан Vilius Normantas 3 January 2011 в 16:45
поделиться