“没什么”的承诺永远不会完成?

时间:2012-03-22 09:56:56

标签: scala akka promise

我想知道为什么当我通过“_”作为完成结果时,'Nothing'的承诺永远不会完成。当我想用Promise来表示事情已经完成时,我碰到了这个:

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

现在我正在使用一个单位的承诺,它运作良好,也更清晰一点。但我仍然想知道上面的代码在超时/未完成的Promise中结束了哪些。

我在Akka 2.0决赛中跑了这个。

2 个答案:

答案 0 :(得分:11)

类型Nothing没有任何可能的值(不是null,根本没有)。 Nothing的承诺无法完成,就像结果类型为Nothing的函数无法返回一样。

由于没有Nothing类型的值,因此无法调用成功。事实上,你并没有称之为成功,你误解了_在这里的含义:

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

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

的快捷方式
x => promiseWithFinish.Success(x)

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

答案 1 :(得分:4)

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

我猜您有一个Promise[Nothing]并且正在尝试将_用作Nothing类型的默认值。但根据定义,类型为Nothing no 值。见http://en.wikipedia.org/wiki/Bottom_type