複数のコードブロックを持つカスタムコントロール構造をbefore { block1 } then { block2 } finally { block3 }
の形式で作成できますか?問題は糖部分についてだけです - 私は機能が簡単に方法に3ブロックを渡すことによって達成できることを知っています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
ほとんどの回答に基づいてThomas Lockney、私はちょうどできるようにコンパニオンオブジェクトを追加しましたimport MyTimer._
ありがとう、皆さん。
これは恥ずかしいほど簡単です:)。ありがとう –