5

Scala 中是否还有公共实例变量?我正在阅读Programming in Scala,其中涵盖了 Scala 2.8。如果我理解正确,它声称 2.8 中的 vars 默认是公共的。

我现在正在尝试为 2.9.1.final 编写代码,而实例变量现在默认是私有的?但是没有public我知道的关键字。(有趣的是,它似乎曾经存在于 2.x 系列中的某个时候,但它在沿线的某个地方神秘地消失了。)

我错过了一些明显的东西吗?

此外,通过扩展,是否有一种简单的方法可以将传递给类构造函数的变量声明为公共的(因为这些变量现在似乎也具有默认的私有可见性)?

例子:

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

Eclipse 声称labelattributesf都是私有的。Scala 2.9.1.final 被用作库。

4

1 回答 1

11

在 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 说这些字段是私有的(假设您意味着当您将鼠标悬停在变量上时)。

于 2011-11-29T17:27:29.887 回答