2016-04-11 7 views
6

Durante una recente intervista che ho avuto con una società di software piuttosto affidabile, sono stato inciampato nel tentativo di fornire una spiegazione valida a una domanda di Scala apparentemente banale. Si consideri il seguente:Cosa succede a un assegnamento di variabile quando chiamo un metodo che restituisce un'istanza di una classe di caso che detiene la suddetta variabile?

case class Person(var age: Int) 
def person = new Person(10) 
person.age = 3 
println(person) 

Questo è ciò che viene restituito dal println dichiarazione:

Person(10) 

La domanda è: perché è questo e che cosa sta accadendo quando ho assegnare 3-person.age?

+1

La risposta migliore era probabilmente: "solo non usare vars in un case class". –

risposta

7

Beh,

def person = new Person(10) 

è una funzione. Cioè, ogni volta che chiami person, crei una nuova istanza di Person. Così, se la funzione inline, il codice sarà simile:

Person(10).age = 3 
println(Person(10)) 

Se si desidera cambiare l'età dell'istanza persona che si è creato prima, è necessario acquisire tale istanza.

val p = person 
p.age = 3 
println(p) 
8

Per questo è necessario capire la differenza tra val e def.

Quando si utilizza def per qualsiasi espressione, viene valutato ogni volta che viene utilizzato. Quindi, in questo caso quando fai un person.age = 3 Creerà una nuova istanza di oggetto persona e assegnerai 3 alla sua età, e quando lo fai, println(person) creerà di nuovo un'istanza di una nuova classe di persone e quindi stampa Person(10).

Quindi, se avete val invece di def in questo modo: val person = new Person(10) e fare

person.age = 3 
println(person) 

l'uscita sarà: Person(3) perché, val viene valutata una volta. Pertanto, in questo caso sarà presente una sola istanza di person, a prescindere dal numero di volte in cui si utilizza person.

Problemi correlati