我有一个在Scala中使用的
try-with-resources
版本。我想知道是否可以使用Shapeless和HList制作一个通用版本?import scala.util.{Failure, Success, Try}
class Loan1[A <: AutoCloseable](resource: A) {
def to[B](block: A => B): B = {
Try(block(resource)) match {
case Success(result) =>
resource.close()
result
case Failure(e) =>
resource.close()
throw e
}
}
}
class Loan2[A <: AutoCloseable, B <: AutoCloseable](r1: A, r2: B){
def to[R](block: (A,B) => R): R = {
Try(block(r1,r2)) match {
case Success(result) =>
r1.close(); r2.close()
result
case Failure(e) =>
r1.close(); r2.close()
throw e
}
}
}
object Loan {
def apply[A <: AutoCloseable](resource: A): Loan1[A] = new Loan1(resource)
def apply[A <: AutoCloseable, B <: AutoCloseable] (r1: A, r2: B)= new Loan2(r1, r2)
}
我猜这里的签名类似
def apply[L <: HList](list: L)(implicit con: LUBConstraint[L, AutoCloseable]) = ???
还有一个问题是如何以元组的形式在block: (A,B) => R
部分中使用元素?
这个能实现吗?