2011-11-29 156 views
2

斯卡拉中是否存在公共實例變量?我正在閱讀編程Scala,其中涵蓋了Scala 2.8。如果我正確地理解了它,它聲稱2.8中的變量默認是公開的。Scala中的公共變量?

我想現在編寫2.9.1.final的代碼,並且實例變量現在默認爲private?但是我沒有注意到關鍵字public。 (有趣的是,它似乎使用某些時候在2.x系列中存在,但它神祕地沿着線路消失。)

我是否缺少明顯的東西?

此外,是否有一種簡單的方法來聲明傳遞給類構造函數的變量是公開的(因爲看起來它們現在也具有默認隱私可見性)?

實施例:

class Instance(label: String, attributes: Array[Int]){ 
    val f = 0 
} 

的Eclipse聲稱labelattributes,和f都是私人。 Scala 2.9.1.final被用作圖書館。

+0

默認情況下,變量是公共的。請發佈說明問題的示例代碼。 –

回答

9

在Scala中,如果省略改性劑,然後實例字段默認爲公用:

scala> class Foo { var foo = 1 } 
defined class Foo 

scala> class Bar { def bar() = { val f = new Foo; f.foo = 5; }} 
defined class Bar 

不用擔心那裏。但是,當您在構造函數中使用的變量,該變量是不一定已到現場:

scala> class Foo(foo: Int) 
defined class Foo 

scala> class Bar { def bar() = { val f = new Foo(5); println(f.foo) }} 
<console>:8: error: value foo is not a member of Foo 
     class Bar { def bar() = { val f = new Foo(5); println(f.foo) }} 
                  ^

所以你可以聲明爲VAL或VAR有它可用:

scala> class Foo(val foo: Int) 
defined class Foo 

scala> class Bar { def bar() = { val f = new Foo(5); println(f.foo) }} 
defined class Bar 

請注意,所有字段實際上都是私有的,但scala公開訪問器方法(foo()和foo _ =(t:Int))以使您能夠訪問這些字段),這就是爲什麼scala-ide說這些字段是私有的假設你的意思是當你將鼠標懸停在變量上時)。

+0

啊,好的。這清除了一些混淆。奇怪的是,Eclipse注意到這些變量是私有的,但我仍然可以從另一個類訪問它們。這只是Scala IDE中的一個錯誤? –

+0

添加了爲什麼scala-ide認爲它是私人的解釋。 –