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

时间:2015-08-21 09:44:21

标签: scala

这两个班的表现不同;原因似乎与使用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 = Person@200a570f
    
    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 = Person@6f75e721
    
    scala> person.age
    res0: Int = -1
    
    scala> person.age = 0
    person.age: Int = 0
    
    scala> person.age
    res1: Int = 0
    

1 个答案:

答案 0 :(得分:10)

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