我找到怎樣的一個古怪的在下面的斯卡拉程序(抱歉,包括所有的代碼,但你會明白爲什麼我說這一切):斯卡拉未能初始化VAL
object md2html extends App {
private val DEFAULT_THEME = Themes.AMAZON_LIGHT
private val VALID_OPTIONS = Set("editorTheme", "logo", "style")
try {
// some code 1
} catch {
case t: Throwable => t.printStackTrace(); exitWithError(t.getMessage)
}
// some code 2 (method definitions only)
private def parseOption(key: String, value: String) = {
println(key + " " + VALID_OPTIONS)
if (! Set("theme","editorTheme", "logo", "style").contains(key)) exitWithError(s"$key is not a valid option")
if (key == "theme") Themes(value).toMap else Map(key.drop(2) -> value)
}
// some code 3 (method definitions only)
}
如果VALID_OPTIONS
在some code...
之後定義,則在parseOption
中評估爲空。我看不出有什麼好的理由。爲了清楚起見,我截斷了代碼,但是如果需要更多代碼,我會很樂意添加它。
編輯:我看了更多一點,這是我發現的。
當延長App
,該val
是不是跟這個代碼
object Test extends App {
printTest()
def printTest = println(test)
val test = "test"
}
與常規主要方法初始化,它工作正常:
object Test {
def main(args: Array[String]): Unit = {
printTest
}
def printTest = println(test)
val test = "test"
}
[Scala - vals的初始化順序]的可能重複(http://stackoverflow.com/questions/14568049/scala-initialization-order-of-vals) – Suma
如果您正在尋找比Suma更具體的原因和0 __「必須是初始化順序」,您需要發佈一個足夠詳細的簡單示例,以便能夠運行以重現問題。 –
這不是一個重複的,因爲我有一個額外的因素:我延長'應用程序' – Dici