2015-09-22 33 views
6

爲什麼這個編譯分配未來[單位],以單位

scala> import scala.concurrent.Future 
import scala.concurrent.Future 

scala> val f: Unit = Future.successful(()) 
f: Unit =() 

我預計編譯器抱怨分配。

回答

14

這被稱爲「價值拋棄」。援引scala specification (6.26.1)

值丟棄

如果e的一些值類型和預期的類型爲單位,e由在術語{Ë嵌入它轉換爲預期的類型; ()}。

換句話說,任何值,無論其類型,都被隱式轉換爲Unit,有效地將其丟棄。

如果您想要警告有關這種丟棄(可能會在某些情況下隱藏錯誤),您可以將-Ywarn-value-discard選項傳遞給編譯器。每次只爲副作用調用方法時,您必須明確地返回(),但該方法確實會返回非單位值。

6

編譯器是好的,因爲將f應用將只執行呼叫

val f: Unit = Future.successful(()) 

和返回值將進入佳境。

2

這基本上是一樣的:

val f: Unit = { 
    Future.successful(()) 
    () 
} 

如果編譯器沒有找到,預計該方法的最後一個值的單位就會把它。