考慮這個基本的Scala示例代碼:調用定義之前它們的功能(前向參考在變量的定義延伸)
object Test {
def main(args: Array[String]) {
inner()
var x: Int = 5
def inner() {
println("x: " + x)
}
}
}
試圖編譯它產生以下錯誤消息:
test.scala:3: error: forward reference extends over definition of variable x
inner()
^
one error found
問題:
- 什麼是t中的前向參考他的語境以及它對「變量x的定義的擴展」意味着什麼?
- 爲什麼前面的代碼會引發這個編譯時錯誤?
- 這個錯誤是如何被捕獲的?似乎編譯器必須實現一些類似解釋器的功能並遵循函數調用!
這個問題不是關於定義的順序,而是關於何時函數被調用。 在定義函數之前調用函數是完全合法的 - 但如果在調用和函數定義之間放置了一個變量,並且該函數使用此變量,它會突然變爲非法。
我想要解釋這種語言功能!爲什麼在那裏?它是如何工作的?還有其他一些更復雜的例子嗎?也就是說,它只是其他功能的一部分,或者是某些規則的結果?
我想象中的編譯器目前正在做:
- 檢查的功能是可以訪問當前範圍的變量封閉,
- 檢查,如果它實際上訪問的變量在當前範圍和
- 每個封閉訪問,檢查變量調用
難道我基本上回答我的第三個問題之前定義的變量?這種行爲是如何工作的?這似乎使編譯器複雜化很多(特別是如果我們考慮具有多個功能級別的情況)。
如果是這樣的話,這是如何融入語言的正式定義,即語法?在我看來,我寫的程序在語法上是正確的。
我想說,這是一個重複的問題,因爲它經常出現,但顯然其他的問題是什麼時候不是很明顯什麼前向引用是。 –