爲什麼這個編譯分配未來[單位],以單位
scala> import scala.concurrent.Future
import scala.concurrent.Future
scala> val f: Unit = Future.successful(())
f: Unit =()
我預計編譯器抱怨分配。
爲什麼這個編譯分配未來[單位],以單位
scala> import scala.concurrent.Future
import scala.concurrent.Future
scala> val f: Unit = Future.successful(())
f: Unit =()
我預計編譯器抱怨分配。
這被稱爲「價值拋棄」。援引scala specification (6.26.1):
值丟棄
如果e的一些值類型和預期的類型爲單位,e由在術語{Ë嵌入它轉換爲預期的類型; ()}。
換句話說,任何值,無論其類型,都被隱式轉換爲Unit
,有效地將其丟棄。
如果您想要警告有關這種丟棄(可能會在某些情況下隱藏錯誤),您可以將-Ywarn-value-discard
選項傳遞給編譯器。每次只爲副作用調用方法時,您必須明確地返回()
,但該方法確實會返回非單位值。
編譯器是好的,因爲將f應用將只執行呼叫
val f: Unit = Future.successful(())
和返回值將進入佳境。
這基本上是一樣的:
val f: Unit = {
Future.successful(())
()
}
如果編譯器沒有找到,預計該方法的最後一個值的單位就會把它。