行为的意外差异似乎是由于使用私有[this]而非私有

Pab*_*blo 12 scala

这两个类的行为不同; 原因似乎与使用private[this]声明而不是a相关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 }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在REPL中,这表现为我对两个类的期望; 也就是说,age方法获取_age,在构造期间已设置为适当的值:

    scala> val person = new Person(-1)
    person: Person = Person@200a570f
    
    scala> person.age
    res0: Int = 0
    
    Run Code Online (Sandbox Code Playgroud)
  • 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 }
      }
    }
    
    Run Code Online (Sandbox Code Playgroud)

    在REPL中,person.age似乎取表达式_age评估之前的值if.尽管如此,它在使用setter后仍然可以正常工作:

    scala> val person = new Person(-1)
    person: Person = Person@6f75e721
    
    scala> person.age
    res0: Int = -1
    
    scala> person.age = 0
    person.age: Int = 0
    
    scala> person.age
    res1: Int = 0
    
    Run Code Online (Sandbox Code Playgroud)

kir*_*uku 10

这是一个已知的错误,即SI-6880.