Неожиданная разница в поведении, по-видимому, связана с использованием private [this] вместо частного

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

Ответ 1

Это известная ошибка, а именно SI-6880.