2012-04-14 47 views
2
 

class Foo() { 
val array // how do I leave initialization till later? 
def initializeArray(size : Int) = array = Array.ofDim[Int](size) 
} 
 

上面的代碼不會編譯,所以如何在以後初始化我的數組?Scala初始化類級別數組變量在方法內

編輯

假設我需要閱讀具有整數的矩陣的文件,並且我要代表矩陣作爲一個二維陣列。當然,我正在解析Foo類中的文件,直到解析完成,矩陣的維纔會知道。

+0

爲什麼你需要離開初始化到以後?這可能比「稍後初始化」有更好的解決方案。 – 2012-04-15 02:28:22

回答

2

一個簡單的方法是將其初始化爲null。要做到這一點,你需要指定一個類型,Array[Int]和使(而不是val),它var,這樣你以後可以改變它:

class Foo() { 
    var array: Array[Int] = null // how do I leave initialization till later? 
    def initializeArray(size : Int) = array = Array.ofDim[Int](size) 
} 

然而,這是不是在斯卡拉非常好的做法。這可能是最好使用Option

class Foo() { 
    var array: Option[Array[Int]] = None // how do I leave initialization till later? 
    def initializeArray(size : Int) = array = Some(Array.ofDim[Int](size)) 
} 

這是告訴用戶,明確,有可能是array可以不設定任何目標,並避免NullPointerException秒。您可以在StackOverflow或其他地方閱讀關於Option的更多信息。

最後,斯卡拉最好的設計依靠不可變的類。在這種情況下,您會推遲創建Foo,直到您確實知道要放入什麼爲止。但是,如果不瞭解設計的其他內容,很難說如何最好地設置它。

編輯:根據您的描述,我會將您的設計分爲兩部分:解析文件的方法以及用於存儲最終結果的不可變的Foo

​​

然後,你可以只說:

val foo = Foo.fromFile(filename) 

foo將是一個完整的,不可改變的Foo

+0

我認爲,我想要做什麼替代?請參閱我的編輯 – nobody 2012-04-14 02:34:45

+0

@qin,根據您的要求進行編輯 – dhg 2012-04-14 02:49:50

4

你可以使用一個懶惰的例如

scala> class Foo { 
    | lazy val array = initialize 
    | def initialize = { 
    | println("initializing...") 
    | new Array[Int](5) 
    | } 
    | } 
defined class Foo 

scala> val f = new Foo 
f: Foo = [email protected] 

scala> f.array 
initializing... 
res46: Array[Int] = Array(0, 0, 0, 0, 0) 

現在,當數組初始化時,您已經推遲了。