2015-08-21 11 views
12

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żenia if. 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 
    

Odpowiedz

Powiązane problemy