Scala是否具有平等的golangs推迟?
自: http://golang.org/doc/effective_go.html#defer
Go的defer语句调度函数调用(延迟函数),在执行defer返回的函数之前立即运行。这是处理必须释放的资源等情况的一种不寻常但有效的方法,无论函数返回哪条路径。规范示例是解锁互斥锁或关闭文件。
答案 0 :(得分:8)
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
}
在这个例子中,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))
次呼叫的对象。
你可以像这样使用这个结构:
before return
dtest: 6
dtest: 3
3
输出结果为:
{{1}}
我知道这可以用不同的方式解决,但它只是一个例子 Scala支持延迟的概念,没有太多的麻烦。
答案 1 :(得分:4)
我想不出Scala的具体方式,但这不等同于(虽然不那么漂亮):
try {
// Do stuff
} finally {
// "defer"
}
答案 2 :(得分:2)
没有。 Go具有这种结构,因为它不支持异常并且没有try...finally
语法。
就个人而言,我认为它会引发维护噩梦;对延迟的调用可以隐藏在函数的任何地方。即使负责任的编码人员把这些延迟放在要清理的东西旁边,我认为它不如finally
块明确,以及它让凌乱的编码器做什么......至少finally
块将所有清理工作放在一个地方。
defer
与惯用的Scala相反。 Scala提供了控制程序流程的monadic方法,defer
魔法根本没有贡献。 Monads提供的功能改进超过try...finally
,让你
defer
没有位置。