2011-05-02 73 views
3

Unit被指定爲的AnyVal(其唯一的價值是())亞型,那麼,爲什麼這是可能的:爲什麼單位陣列可以保持爲空?

scala> val units = new Array[Unit](5) 
units: Array[Unit] = Array(null, null, null, null, null) 

是在REPL的陣列式打印機制這只是一個錯誤/遺漏還是有原因呢?

回答

1

它被固定爲斯卡拉2.9和現在的打印效果:

scala> val units = new Array[Unit](5) 
units: Array[Unit] = Array((),(),(),(),()) 
3

我認爲這是數組初始化的問題/限制。對於原始值,數組被初始化爲它們的缺省值,我由JVM通過利用本地數組的Scala數組假定它。

對於其他類型,該值將被包裝到一個對象中,看起來它們初始化爲null。

如果你想要一個單位數組,你可能需要撥打val units = Array.fill(5)(())

3

空,大概是隻應該出現在這個字符串表示。一旦你得到一個值從數組中,它是「拆箱」,以Unit

scala> val units = new Array[Unit](5) 
units: Array[Unit] = Array(null, null, null, null, null) 

scala> units(0) 
// note: no result 

比較:

scala> val refs = new Array[AnyRef](5) 
refs: Array[AnyRef] = Array(null, null, null, null, null) 

scala> refs(0)       
res0: AnyRef = null // we do get the null here 

有一個類似的討論在that questionNothing而不是Unit

+0

我不知道該股價值被拆箱:'(新陣列[單位](5))(0)==()'返回'false'。並且'(new Array [Unit](5))(0)== null'返回true並且有一個有趣的警告! '{val a = Array.fill(5)(());一個(0)==()}'將返回'true'。 – huynhjl 2011-05-02 20:27:56