2016-10-04 80 views
0

在Java中,我將類字段理解爲可從整個類中的所有位置訪問的變量,並且這種類型描述了實例的狀態結構。在Java領域是在任何方法之外定義的(這是唯一可以在方法之外的東西)。在Scala構造函數中是否有本地值/變量?

在Scala中,「任何方法之外」是主要構造方法 - 換句話說:沒有「任何方法之外」。因此字段在主構造函數中定義。因此構造函數中的任何變量/值都是一個字段。即使給構造函數的參數也是自動的類字段,而不是Java中的本地構造函數變量。

如果我得到了所有正確的答案:Scala構造函數中是否有局部變量/值?

如果不是:爲什麼決定不需要這樣的事情?

Clarficiation:我問的是概念,而不是特定的情況。另外我不要問如何解決如何獲得像局部變量(雖然我會很感激,如果答案是沒有任何)。

+2

[Scala的構造局部變量]的可能的複製(http://stackoverflow.com/questions/10162539/constructor-local-variables-in-scala) –

+0

@AleksandarStojadinovic:你讀過的其他問題?據我所知,這是一個具體的案例,我的問題是關於概念。 – Make42

+0

我以爲你的問題是「有沒有這樣的變量」,而另一個問題的答案是:「不」。或者我錯過了什麼? –

回答

1

整個班級體是「構造者」。

您可以隨時將任意變量的範圍限制爲小一點,因爲您需要一對大括號,因此沒有理由引入額外的「概念」,它沒有任何特定的用途。奧卡姆剃刀。

class Foo(bar: String) { // constructor parameter 
    val baz = "baz"; // class member 
    { 
     val bat = "bat" // "local" variable 
     println(bar + baz + bat) // all three are visible 
    } 
    println(bar + baz) // only first two are accessble 
    } 
    println (new Foo("bar").baz) // only class member can be accessed here 
+0

但是局部變量存在於輔助構造函數中,對嗎?僅僅是語法使它們成爲可能,還是有理由爲什麼應該存在局部變量? – Make42

+0

@ Make42「局部變量」存在於一對大括號之間的任何地方。如果你寫這樣的'def this()= foo'這樣的輔助構造函數,它不能有局部變量。如果你這樣寫'def this()= {val foo = 1;吧()}'那麼它可以。 這不是關於構造函數的類型,而是關於大括號。把它們放在主構造函數中 - 你也可以有局部變量。不要把它們放進去 - 你不能。 – Dima

+0

實際上,一個輔助構造函數總是必須是這樣的形式:def this(...)= {this(...); ''。你可以寫'def this()= this({val foo = 1; foo})'。 –

相關問題