2012-03-22 92 views
4

我想知道爲什麼當我通過「_」作爲完成結果時,「Nothing」的承諾永遠不會完成。我就遇到了這個時候我想用一個無極信號的東西已經完成:'沒有'的承諾永遠不會完成?

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

現在我使用單位的承諾,它工作正常,也更加清楚一點。但我仍然想知道上面的代碼是以超時/未完成的Promise結束的。

我與Akka 2.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) 

您正在創建一個函數值,不使用它,你都無所事事的快捷方式。

+0

好的謝謝。我預計我在這裏誤解了'_'。感謝您的澄清。 – Gamlor 2012-03-22 11:16:26

4

我不認爲promiseWillFinish.success(_)意味着你的想法。它是部分應用程序,這意味着該表達式的結果是一個函數。您從未調用過success方法,只是爲方法調用創建了一個新的匿名函數。

我想你有一個Promise[Nothing],並試圖使用_作爲Nothing類型的默認值。但根據定義,沒有類型的值Nothing。見http://en.wikipedia.org/wiki/Bottom_type

+0

感謝您的澄清。 – Gamlor 2012-03-22 11:16:57