Scala是否有平等的golangs推迟?
来自:http: //golang.org/doc/effective_go.html#defer
Go的defer语句调度函数调用(延迟函数),在执行defer返回的函数之前立即运行.这是处理必须释放的资源等情况的一种不寻常但有效的方法,无论函数返回哪条路径.规范示例是解锁互斥锁或关闭文件.
Scala不提供defer设计,但是你可以通过将函数包装在另一个函数中来自己创建它,传递跟踪函数的对象来调用.
例:
class DeferTracker() {
class LazyVal[A](val value:() => A)
private var l = List[LazyVal[Any]]()
def apply(f: => Any) = { l = new LazyVal(() => f) :: l }
def makeCalls() = l.foreach { x => x.value() }
}
def Deferrable[A](context: DeferTracker => A) = {
val dt = new DeferTracker()
val res = context(dt)
dt.makeCalls
res
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,Deferable将是包装函数,它调用context并返回它的内容,给它一个跟踪defer调用的对象.
你可以像这样使用这个结构:
def dtest(x:Int) = println("dtest: " + x)
def someFunction(x:Int):Int = Deferrable { defer =>
defer(dtest(x))
println("before return")
defer(dtest(2*x))
x * 3
}
println(someFunction(3))
Run Code Online (Sandbox Code Playgroud)
输出将是:
before return
dtest: 6
dtest: 3
3
Run Code Online (Sandbox Code Playgroud)
我知道这可以用不同的方式解决,但它实际上只是一个例子,Scala支持延迟的概念而不用太大惊小怪.
我想不出一种Scala特定的方式,但这不是等效的(尽管不那么漂亮):
try {
// Do stuff
} finally {
// "defer"
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1378 次 |
| 最近记录: |