Te dwie klasy zachowują się inaczej; Przyczyna wydaje się być związana z użyciem deklaracji private[this]
zamiast z private
. Czy ktoś może wyjaśnić, dlaczego?Nieoczekiwana różnica w zachowaniu na pozór wynikająca z używania prywatnego [this] zamiast prywatnego
private
:class Person( private var _age: Int ) { if (_age < 0) { _age = 0 } def age = _age def age_=(newAge: Int) { if (newAge > _age) { _age = newAge } } }
W REPL, to zachowuje się jak się spodziewałem dla obu klasach; czyli metoda
age
dostaje_age
, który został ustawiony na odpowiednią wartość w trakcie budowy: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 } } }
W REPL,
person.age
wydaje się mieć wartość_age
uprzedniej do oceny wyrażeniaif
. To działa zgodnie z oczekiwaniami po użyciu setter, choć: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