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

Rya*_*ach 9 scala go

Scala是否有平等的golangs推迟?

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

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

nem*_*emo 9

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支持延迟的概念而不用太大惊小怪.

  • 您可能还需要某种异常处理 - 使用defer()在出错后进行清理,但它们实际上没有异常,因此它们不需要处理它们.Scala确实如此,因此可能值得尝试在最终处理程序中捕获异常. (2认同)

fre*_*oma 5

我想不出一种Scala特定的方式,但这不是等效的(尽管不那么漂亮):

try {
    // Do stuff   
} finally {
    // "defer"
}
Run Code Online (Sandbox Code Playgroud)