2009-04-29 25 views
19

我正在學習Scala - 來自C++背景。我正在嘗試 爲一個任務跟蹤應用程序編寫一個小課程,我正在一起攻擊 幫助我學習如何編寫Scala。使用類變量作爲Scala中的常量

這好像應該是簡單的,但由於某種原因,它躲避我:

package com.catenacci.tts 

class Task(val ID:Int, val Description:String) { 
val EmptyID = 0 
val EmptyDescription = "No Description" 

def this() = this(EmptyID,EmptyDescription) 
def this(ID:Int)={ 
    this(ID,EmptyDescription) 
} 
def this(Description:String)={ 
    this(EmptyID,Description) 
} 
} 

我想提供三個構造函數:任務(ID,描述), 任務(ID),任務(描述)。在後兩種情況下,如果其中一個值不是由調用者提供的 ,我想 將值初始化爲常量值。我希望能夠在單元測試目的下檢查該類的外部 。所以我認爲在兩個 公共vals會讓我從課外檢查,使 確定我的狀態是我所期望的。

但是,由於某些原因,這段代碼無法編譯。我得到以下錯誤:

error: not found: value EmptyID 

error: not found: value EmptyDescription 

所以我缺少什麼?我正在通過「編程斯卡拉」如此 如果這個問題有一個簡單的答案,請給我頁 號碼。我不介意閱讀,但通過第60頁和 第62頁的代碼,我看不出爲什麼這個代碼失敗。

我猜這跟 構造函數方法有關,可能這兩個val不是初始化爲 直到構造函數結束。如果是這種情況,有一些 方式來獲得我正在尋找的效果?

+1

另請參見SIP 23或`42.type`:http://stackoverflow.com/a/39065260/6309 – VonC 2016-08-21 14:24:45

回答

38

您可以在同伴對象定義常量:

object Task { 
val EmptyID = 0 
val EmptyDescription = "No Description" 
} 

,然後引用它們作爲Task.EmptyID和Task.EmptyDescription。

我認爲Scala 2.8支持默認值。

8

請參閱Germán的答案。發生這種情況是因爲構造函數在技術上是部分的靜態範圍。換句話說,構造函數不能訪問任何實例成員,因爲該實例尚未創建。任何「類成員」實際上都是實例成員,這就是爲什麼問題中的代碼不起作用。 Germán的答案通過將兩個相關值移入伴隨對象來解決這個問題,這有效地使它們成爲類的靜態成員(不是真的,但你可以這樣想)。

+0

謝謝 - 很高興知道爲什麼這不起作用以及知道如何解決它。 – 2009-04-30 00:51:47

1

在「Programming in Scala」中,參見6.7節,其中解釋了構造函數調用的鏈接。主要構造函數被描述爲「一個類的單一入口點」。