2011-11-29 125 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认为它是私人的解释。 –