Variables publiques à Scala?
Question
Y at-il des variables d'instance publiques plus à Scala? Je lis Programmation Scala , qui couvre Scala 2.8. Si je comprends bien, il prétend que VARs 2.8 sont par le public par défaut.
Je suis en train de écrire du code pour 2.9.1.final maintenant, et variables d'instance sont maintenant par des entreprises privées par défaut? Mais il n'y a pas de mot-clé public
que je suis au courant. (Il est intéressant, il semble qu'il utilisé pour exister quelque temps dans la série 2.x, mais quelque part, il a mystérieusement disparu le long de la ligne.)
Suis-je manque quelque chose évidente?
En outre, par extension, est-il un moyen facile de déclarer une variable passée à un constructeur de classe pour être publique (car il semble que ceux-ci ont également une visibilité privée par défaut maintenant trop)?
Exemple:
class Instance(label: String, attributes: Array[Int]){
val f = 0
}
Eclipse affirme que label
, attributes
et f
sont toutes privées. Scala 2.9.1.final est utilisé comme la bibliothèque.
La solution
Dans scala, si vous ne spécifiez pas le modificateur, puis champs d'instance sont publiques par défaut:
scala> class Foo { var foo = 1 }
defined class Foo
scala> class Bar { def bar() = { val f = new Foo; f.foo = 5; }}
defined class Bar
Pas de soucis là-bas. Cependant, lorsque vous utilisez une variable dans un constructeur, la variable est pas nécessairement tourné dans un champ:
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) }}
^
vous pouvez le déclarer comme val ou var pour qu'il soit disponible:
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
Notez que tous les champs sont en fait privés, mais scala expose accesseur méthodes (foo () et foo _ = (t: Int)) pour vous permettre d'accéder aux champs), ce qui explique pourquoi scala-ide dit que les champs sont privés (en supposant que vous voulez dire quand vous survolez la variable).