關於Scala變量的範圍的確切處理是什麼?變量的嵌套/內部範圍
當我打開大括號我仍然可以訪問外瓦爾的價值(如果瓦爾對其進行修改):
scala> var mmm = 4
mmm: Int = 4
scala> {
| println(mmm)
| mmm += 2
| println(mmm)
| }
4
6
scala> println(mmm)
6
但他的書Odersky的說,180頁或
In a Scala program, an inner variable is said to shadow a like-named outer variable, because the outer variable becomes invisible in the inner scope.
這似乎更加古怪:
scala> val a = 4
a: Int = 4
scala> {
| println(a)
| }
4
所以我得到一份拷貝的它在內部範圍內創建?
scala> val a = 4
a: Int = 4
scala> {
| val a = 8
| }
爲什麼我再說一遍VAL如果一成不變?
scala> val a = 4
a: Int = 4
scala> {
| println(a)
| val a = 8
| println(a)
| }
但是這一個我得到一個錯誤:
error: forward reference extends over definition of value a
println(a)
IM仍然困惑,我只是不能讓我的頭一輪的(我猜它是我的錯):現在 我知道外殼是不同的 - 但我可以理解它是如何工作的,比如說: martin @ mintbox〜$'a = 5 martin @ mintbox〜$(echo $ a; a = 8; echo $ a)馬丁@ mintbox〜$回聲$一個 5' 那裏我可以看到創建了一個範圍(用var和子shell的副本可以在不影響外部的VAL - 但可以在內部副本 但如何你解釋我的第一個例子,內部增量改變外部值? – mbrambley
用Q編輯過 – mbrambley
@mbrambley - 內部增量是外部值的增量。你不會因爲你打開一些大括號而丟掉所有的變量。這就像在這方面進行子類化:孩子仍然可以訪問父項中的所有內容,但可以添加自己的內容(或替換父項內容)。這不是_actually_子類化,但也許這會幫助你看到發生了什麼。 –