Scala是否具有与golang相同的延迟?

时间:2013-09-17 08:45:47

标签: scala go

Scala是否具有平等的golangs推迟?

自: http://golang.org/doc/effective_go.html#defer

  

Go的defer语句调度函数调用(延迟函数),在执行defer返回的函数之前立即运行。这是处理必须释放的资源等情况的一种不寻常但有效的方法,无论函数返回哪条路径。规范示例是解锁互斥锁或关闭文件。

3 个答案:

答案 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将是调用contextdefer的包装函数 返回内容,为其提供跟踪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没有位置。