2010-05-02 102 views
16

我有一個類,我喜歡通過讀取配置文件來初始化我的var,該配置文件生成中間對象/ vals,我希望將它們分組並隱藏在方法中。 這裏是最低限度的問題 - 我用一個參數i調用ctor,實際上是一個文件來解析,而init-method生成的是字符串s,實際上比這裏更復雜,有很多中間對象創建:在scala中初始化var

class Foo (val i: Int) { 

    var s : String; 

    def init() { 
     s = "" + i 
    } 

    init() 
} 

會產生這樣的錯誤:class Foo needs to be abstract, since variable s is not defined。在這個例子中,通過將String設置爲「」可以很容易解決:var s = "";,但實際上該對象比String更復雜,沒有適當的Null實現。

我知道,我可以使用的選項,這不是字符串也適用於更復雜的東西:

var s : Option [String] = None 

def init() { 
    s = Some ("" + i) 
} 

或者我可以用我的methodcall免除。使用選項會迫使我一遍又一遍地寫一些東西,沒有多少好處,因爲不需要別人來以我想的方式初始化它。

是否有另一種方法來實現我的目標?

+0

那麼,在Scala中,你永遠不能聲明'var s:String',然後用其他方法初始化它? – asgs 2016-04-23 14:25:04

回答

17

而不是創建初始化不同的方法,你應該使用執行初始化以下方式:

class Foo(val i: Int) { 
    var s: String = { 
    var s0 = " " 
    s0 += i 
    // do some more stuff with s0 
    s0 
    } 

    var dashedDate = { 
    val dashed = new SimpleDateFormat("yy-MM-dd") 
    dashed.format(updated) 
    } 

    // Initializing more than one field: 
    var (x, y, z) = { 
    var x0, y0, z0 = 0 
    // some calculations 
    (x0, y0, z0) 
    } 
} 
+0

爲什麼downvote? – missingfaktor 2010-05-03 01:26:43

+0

昨天我沒有提交我的評論?那麼,現在我看到它,你在一個塊中用一個元組的答案看起來很明顯。我喜歡。 – 2010-05-03 09:11:12

15

var s : Whatever = _將初始化s到默認值,無論(空引用類型,0數字,假的布爾變量等)

+0

我也會測試。 :) – 2010-05-02 21:15:52

+0

我測試了它,它也起作用。 :) – 2010-05-12 03:24:14

+3

謝謝!這是scala中的最佳做法嗎? – voho 2015-01-15 14:02:12

0

老實說,你爲什麼使用var?爲什麼不只是這樣做:

val rootObject = readFile(filename) 

這將對我最有意義。

+0

a)因爲真實對象不是一個String,而是可變對象。和b)通過讀取文件來初始化更多的對象,例如文件中指定尺寸的數組以及數組的內容。 – 2010-05-03 17:25:10

+0

爲什麼它是可變的?你錯過了這一點。 此外,VAL arrayBuffer =新ArrayBuffer [的MyType]() 然後arrayBuffer.toArray – egervari 2010-05-03 19:55:44

+0

如果它是一個unmutable VAL,我會明白,我不能行x聲明它和行x + N initialice它| N> 0。所以我提到它是一個var而不是val。 – 2010-05-04 00:56:03