Ответ 1
Это известная ошибка, а именно SI-6880.
Эти два класса ведут себя по-разному; причина кажется связанной с использованием объявления private[this]
вместо private
. Может кто-нибудь объяснить, почему, пожалуйста?
private
:
class Person(
private var _age: Int
) {
if (_age < 0) { _age = 0 }
def age = _age
def age_=(newAge: Int) {
if (newAge > _age) { _age = newAge }
}
}
В REPL это ведет себя так, как я ожидал для обоих классов; то есть метод age
получает _age
, который был установлен в соответствующее значение во время построения:
scala> val person = new Person(-1)
person: Person = [email protected]
scala> person.age
res0: Int = 0
private[this]
:
class Person(
private[this] var _age: Int
) {
if (_age < 0) { _age = 0 }
def age = _age
def age_=(newAge: Int) {
if (newAge > _age) { _age = newAge }
}
}
В REPL, person.age
появляется значение _age
до оценки выражения if
. Он работает как ожидается после использования setter, хотя:
scala> val person = new Person(-1)
person: Person = [email protected]
scala> person.age
res0: Int = -1
scala> person.age = 0
person.age: Int = 0
scala> person.age
res1: Int = 0
Это известная ошибка, а именно SI-6880.