====== 'Loan' pattern ====== Ensures that a resource is deterministically disposed of once it goes out of scope. The normal way to do this in Java is with a ''try ... finally'' block, which leads to ugly and fragile code, especially when there are multiple resources: var r : Resource = null try { r = getResource() useResource(r) } finally { if(r != null) r.dispose() } This can be improved in Scala by encapsulating the disposal code in a function which takes a closure: def using[A](r : Resource)(f : Resource => A) : A = try { f(r) } finally { r.dispose() } The client code now looks like this: using(getResource())(r => useResource(r) ) The ''using'' function above can be generalized to arbitrary resources by letting the resource type be a type parameter. Assuming that ''Resource'' is a mixin class requiring the definition of a ''dispose'' method, one can write: def using[A, R <: Resource](r : R)(f : R => A) : A = try { f(r) } finally { r.dispose() } Probably best of all, though, is to provide library functions that call ''getResource()'' internally. Then we would have, for each resource, a function that looks like this: def withResource[A](f : Resource => A) : A = { val r = getResource() // Replace with the code to acquire the resource try { f(r) } finally { r.dispose() } } Client code becomes very simple: withResource{ r => // do stuff with r.... } Client code now obtains the resource 'on loan', and the compiler will guarantee that it is always returned. Care must still be taken to ensure that side-effects of ''f'' do not retain references to disposed resources.