2

我正在使用来自第三方代码的函数,如下所示:

scala> def willCallback(fun: Function1[Int, Unit]) {
     | doWork()
     | fun(1)
     | }
willCallback: (fun: Int => Unit)Unit

在我的代码中,我定义了一个函数并希望它返回回调函数参数,以实现此目的:

scala> def callbackResult():Int = {
     |   willCallback( (i:Int) => {
     |     // What do I put here 
     |     // to make the return value of callbackResult to be i?
     |   })
     | }

我该怎么做才能让它发挥作用?

谢谢。

4

4 回答 4

4

从您的评论看来,您希望willCallback在回调执行之前阻止。以下是使用Scala 2.10 中的Future/Promise API 的方法,

import scala.concurrent._

// Library code (which you can't modify)
def willCallback(fun: Int => Unit) { fun(1) }

// Your code. You can fulfill a `promise` in your callback
def callbackResult(): Int = {
  val p = promise[Int]
  val f = p.future

  willCallback { i: Int =>
    p.success(i)
  }

  // Block until the promise has been fulfilled (the callback has executed).
  // In this case, the return value is 1
  Await.result(f, duration.Duration.Inf)
}

当然,如果回调永远不会执行,您的callbackResult()方法将无限期挂起。正如 Régis Jean-Gilles 所建议的那样,为了避免这种危险,与其等待它的价值,不如callbackResult()返回f: Future[Int]而不是等待它的价值可能会更好。Int

于 2013-02-15T07:41:14.447 回答
1

真的不清楚你想要什么或期望什么,但return对新手来说既是困惑又是不可取的。

尝试将您的“回调”表述为表达式或表达式序列。最后一个表达式是您要“返回”的值。

您需要知道的是return从顶级方法返回,而不是函数或内部方法。

于 2013-02-15T06:04:28.623 回答
1

你是这个意思吗?

def callbackResult(result:Int) = {
   // code
}

willCallback(callbackResult)

另一个版本是:

willCallback( { result =>
   // code
})
于 2013-02-15T07:37:17.603 回答
1

目前尚不清楚您要达到的目标,但这是另一个镜头:

def callbackResult():Int = {
  var result = 0
  willCallback( (i:Int) => {
    result = i
    // rest of your code
  })
  result
}
于 2013-02-15T07:42:04.047 回答