2012-04-06 14 views
6
programmatore

Scala avrebbe dovuto sapere che questo tipo di scrittura:Ogni metodo "setter" richiede un metodo "getter" in Scala?

class Person{ 
    var id = 0 
} 
var p = new Person 
p.id 
p.id = 2  

equivale a

class Person{ 
private var _id = 0 
def id = _id 
def id_=(i: Int) = _id = i 
} 
val p = new Person 
p.id // be equal to invoke id method of class Person 
p.id = 2 // be equal to p.id_=(2) 

a tutti gli effetti. Ma se si commento il metodo getter def id = _id, p.id = 2 causerà un errore di compilazione, dicendo

error: value key is not a member of Person 

Qualcuno potrebbe spiegare perché?

+0

Le tue due definizioni di 'Persona' non sono esattamente equivalenti, perché la seconda genererà anche metodi getter e setter privati ​​per' _id'. –

risposta

8

Il compilatore è così perché le specifiche lo dicono.

Vedere Scala Reference, p. 86, §6.15 Assegnazioni.

Nota che nulla vi impedisce di:

  • rendendo il getter private
  • rendendo il ritorno getter un altro tipo
  • rendendo il getter “uncallable”, ad esempio, così: def id(implicit no: Nothing)
+0

la tua risposta mi rende felice :-) –

+0

Non riesco a vedere come questa sezione della specifica richiede un getter per far funzionare il setter. Puoi (o chiunque altro) spiegare? –

+1

"Se' x' è una funzione senza parametri definita in alcuni modelli, e lo stesso modello contiene una funzione di settaggio 'x_ =' come membro, quindi l'assegnazione 'x = e' viene interpretata come l'invocazione' x _ = (e) ' di quella funzione setter. "Ciò richiede che' x' sia una funzione senza parametri. –