4

我想知道为什么当我将“_”作为完成结果传递时,“无”的承诺永远不会完成。当我想使用 Promise 来表示某事已经完成时,我遇到了这个问题:

  val promiseWillFinish = Promise()
  promiseWillFinish.success(_)
  // will time out
  Await.ready(promiseWillFinish, 5 seconds)
  // will return false
  println(promiseWillFinish.isCompleted)

现在我使用的是 Promise of Unit,它工作得很好,而且也更清晰一些。但我仍然想知道上面的哪个代码以超时/未完成的 Promise 结束。

我用 Akka 2.0 final 运行了这个。

4

2 回答 2

12

没有任何可能的类型值Nothing(不是null,根本没有)。一个promise ofNothing不能完成,就像一个具有result 类型的函数Nothing不能返回一样。

由于没有 type 的值Nothing,因此无法调用成功。实际上,您并没有称其为成功,而是误解了 _ 在这里的含义:

当您声明 a 时var(并且仅当您声明它时),您可以使用 '_' 将其设置为默认值。var v : Int = _将设置v0var v: String = _并将其设置为null。如果您尝试使用 Nothing, var v : Nothing = _,它将崩溃。同样,没有 type 的值Nothing

另一方面,当你写promiseWithFinish.Success(_)它时,它是一个快捷方式

x => promiseWithFinish.Success(x)

您正在创建一个函数值,而不是使用它,您什么​​都不做。

于 2012-03-22T10:51:26.423 回答
4

我不认为promiseWillFinish.success(_)意味着你认为它意味着什么。它是部分应用,这意味着该表达式的结果是一个函数。您从未调用过该success方法,只是为方法调用创建了一个新的匿名函数。

我猜你有一个Promise[Nothing]并且试图_用作 type 的默认值Nothing。但是根据定义,没有type 的值Nothing。见http://en.wikipedia.org/wiki/Bottom_type

于 2012-03-22T10:50:30.940 回答