Эти два класса ведут себя по-разному; причина кажется связанной с использованием объявления 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