2016-09-07 29 views
0

我很困惑與下面的初始化VAR initalization

var in = None: Option[FileInputStream] 

但是我所知道的是,

var varName : type = _ // default value initialization 
var varName : type = someValue // other than default intitalization 

但什麼是

var in = None: Option[FileInputStream] 

請幫助 謝謝

回答

2
// [name] = [value] : [type] 
var in  = None : Option[FileInputStream] 

// can equivalently be written as: 
var in: Option[FileInputStream] = None  

這會創建一個類型爲Option[FileInputStream]的變量,初始值爲None。 要了解更多關於Scala的Option型,看http://www.scala-lang.org/api/current/#scala.Option

+0

謝謝,我只是嘗試在REPL,發現同樣。既然Scala有很大的syntex,所以我認爲它會有一些特定的含義 – optional

4

這就是所謂的類型歸屬所得表達式稱爲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進行初始化。因此,重新解釋NoneOption,使斯卡拉推斷正確的類型:

var in = None: Option[FileInputStream]