Может ли кто-нибудь помочь мне создать DSL для хранения ресурсов? Я хочу использовать его аналогично synchronized
в Java, чтобы, если ресурс (java: монитор объекта) уже был получен, он не был получен снова! (Для следующего примера предполагается, что ресурсы имеют тип Int
)
object Holding {
def main(args : Array[String]) : Unit = {
HoldResource(1,2,3) {
// holding resource 1,2,3
println("!")
HoldResource(3) {
// still holding resource 1,2,3 (but not acquiring resource 3 again!!!)
println("*")
}
println("!!")
HoldResource(4,5) {
// holding resource 1,2,3,4,5
println("#")
}
println("!!!")
}
// all resources are freed
}
}
До сих пор мой ГРУБЫЙ подход выглядит так (это означает, что я знаю о шаблоне ресурсов try { ... } finally { ... }
):
object HoldResource {
class Context(val resources: Seq[Int]) {
def apply[A](f: => A): A = {
try { f } finally {
// free resources
}
}
}
def apply[A](resources: Int*): Context = {
// lock/acquire resources
new Context(resources)
}
}
Большое спасибо!