Có thể tạo cấu trúc điều khiển tùy chỉnh với một số khối mã, theo kiểu before { block1 } then { block2 } finally { block3 }
không? Câu hỏi là về phần đường chỉ - tôi biết các chức năng có thể dễ dàng đạt được bằng cách đi qua ba khối để một phương pháp, như doInSequence(block1, block2, block3)
.Scala: cấu trúc điều khiển tùy chỉnh với một số khối mã
Ví dụ thực tế về cuộc sống. Đối với các tiện ích thử nghiệm của tôi, tôi muốn tạo một cấu trúc như thế này:
getTime(1000) {
// Stuff I want to repeat 1000 times.
} after { (n, t) =>
println("Average time: " + t/n)
}
EDIT:
Cuối cùng tôi đã đưa ra giải pháp này:
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)
}
Đầu ra là:
1
2
3
...
99
100
Average time: 10.23
Chủ yếu dựa trên câu trả lời bằng Thomas Lockney, tôi vừa thêm đối tượng đồng hành để có thể import MyTimer._
Cảm ơn tất cả các bạn.
Thật đáng xấu hổ :). Cảm ơn –