借贷模式(Loan Pattern)正如其名,就是把一个“资源”借出去给别人用,而自己负责资源的回收。python中的with语句就是这个模式的一个实现。Scala中虽然没有直接提供with语句,但借助其完善的类型系统和对函数式的支持,我们可以自己实现一个。
借贷模式有什么用?
使用“资源”时,比如Flie、Stream等,一定要记得在用完时close它们。使用借贷模式的一大好处就是,对于使用者不用再关心close资源这件事了,模式会自动帮你把他们关掉。
借贷模式怎么做?
利用Scala中的结构类型,可以实现“借贷模式”(完整代码可以看这里):
object using {
def apply[R <: {def close() : Unit}, T](resource: => R)(f: R => T): T = {
val source = Option(resource)
try {
f(source.get)
} finally {
for (s <- source)
s.close()
}
}
}
使用方法示例如下:
using(new File()) { file =>
println(file.getName)
}
附:结构类型(Structural Types)
[R <: {def close() : Unit}, T]
这段代码中的{def close() : Unit}
实际上就是定义了一个结构类型。结构类型是Scala强大类型系统中,可以实现类似“动态类型”效果的一个魔法。
鸭子测试:
如果一个对象看起来像鸭子,游泳像鸭子,叫声像鸭子,那么它可能就是只鸭子。我们就可以暂时把这个对象当做鸭子来用。
如上的定义中,只要类中有一个返回Unit
的close()
方法,都被认为是这个结构类型的子类,都满足R <: {def close() : Unit}
这个约束。这样,我们定义的这个using()
就可以支持各种各样资源的类型,只要它有close()
方法。
网友评论