這就是所謂的類型歸屬所得表達式稱爲typed expression。它,好,歸咎於一個類型的表達式:
expr: Type
的意思是「把expr
,好像有Type
」。
例如:
1
// Int
1: Float
// Float
顯然,表達需要順應其歸因於它的類型。
類型歸屬的最廣泛使用的例子可能是_*
僞類型,解包一個Seq
到一系列的參數:
def sumNums(nums: Int*) = nums.sum
sumNums()
//=> 0
sumNums(1)
//=> 1
sumNums(1, 2)
//=> 3
sumNums(Seq(1, 2))
// error: type mismatch;
// found : Seq[Int]
// required: Int
// sumNums(Seq(1, 2))
// ^
sumNums(Seq(1, 2): _*)
//=> 3
你的具體情況,我覺得有問題歸於一類一個表達式只是爲了讓類型inferencer推斷正確的類型,當你可能只是以及宣佈正確的類型開始說起:
var in: Option[FileInputStream] = None
至於您的評論:
但是我知道的是,
var varName : type = _ // default value initialization
var varName : type = someValue // other than default intitalization
您也可以省略類型:
var varName = someValue
在這種情況下,該類型是從表達someValue
推斷。
var varName = _
顯然,這是行不通的:類型是從表達式推斷出來的,但表達式的值是從類型推斷出來的。因此,這是不允許的。
你的例子使用推斷類型的形式:
var in = someExpression
所以,in
類型是從someExpression
類型推斷。
現在,如果我們說
var in = None
然後推斷in
類型將是None.type
,即單類型的None
對象。但是這沒有道理:當我們給它一個單例類型,即只有一個實例的類型時,我們爲什麼會有一個var
,即一個我們可以改變的變量。所以,我們可以根據需要隨時重新分配in
,但我們只能將相同的事情分配給它。這是不合邏輯的。 (好吧,從技術上講,我們也可以分配null
。)
事實上,我們希望能夠分配一些東西給它,但也知道我們是否分配了一些東西。這就是爲什麼我們在這種情況下使用Option
,並用None
進行初始化。因此,重新解釋None
爲Option
,使斯卡拉推斷正確的類型:
var in = None: Option[FileInputStream]
謝謝,我只是嘗試在REPL,發現同樣。既然Scala有很大的syntex,所以我認爲它會有一些特定的含義 – optional