Открытые переменные в Scala? - PullRequest
3 голосов
/ 29 ноября 2011

Есть ли в Scala публичные переменные экземпляров? Я читаю Программирование на Scala , которое охватывает Scala 2.8. Если я правильно понимаю, он утверждает, что переменные в 2.8 по умолчанию являются общедоступными.

Я пытаюсь написать код для 2.9.1.final сейчас, а переменные экземпляра теперь по умолчанию закрыты? Но нет ключевого слова public, о котором я знаю. (Интересно, что использовал для существования когда-то в серии 2.x, но он таинственным образом исчез где-то вдоль линии.)

Я что-то упускаю из виду?

Кроме того, существует ли простой способ объявить переменную, переданную в конструктор класса, общедоступной (так как похоже, что теперь они также имеют частную видимость по умолчанию)?

Пример:

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

Eclipse утверждает, что label, attributes и f являются частными. Scala 2.9.1.final используется в качестве библиотеки.

1 Ответ

10 голосов
/ 29 ноября 2011

В 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 говорит, что поля являются частными (при условии, что вы имеете в виду, когда наводите курсор на переменную).

...