我想知道为什么当我通过“_”作为完成结果时,'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决赛中跑了这个。
答案 0 :(得分:11)
类型Nothing
没有任何可能的值(不是null
,根本没有)。 Nothing
的承诺无法完成,就像结果类型为Nothing
的函数无法返回一样。
由于没有Nothing
类型的值,因此无法调用成功。事实上,你并没有称之为成功,你误解了_在这里的含义:
当您声明var
时(仅当您声明它时),您可以使用'_'将其设置为默认值。 v ar v : Int = _
会将v
设置为0
,var 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