Domanda

Sto lavorando per imparare Scala, proveniente da un background C ++. sto provando per scrivere una piccola classe per un'app di tracciamento delle attività a cui sto hackerando insieme aiutami a imparare come programmare Scala.

Sembra che dovrebbe essere semplice ma per qualche ragione mi sfugge:

package com.catenacci.tts

class Task(val ID:Int, val Description:String) {
 val EmptyID = 0
 val EmptyDescription = "No Description"

 def this() = this(EmptyID,EmptyDescription)
 def this(ID:Int)={
   this(ID,EmptyDescription)
 }
 def this(Description:String)={
   this(EmptyID,Description)
 }
}

Sto cercando di fornire tre costruttori: Task (ID, Descrizione), Attività (ID), Attività (Descrizione). In questi ultimi 2 casi voglio inizializzare i valori su valori costanti se uno dei valori non lo è fornito dal chiamante. E voglio poterlo controllare fuori della classe a fini di test unitari. Quindi ho pensato di metterne in due i valori pubblici mi permetterebbero di controllare dall'esterno della classe per fare certo che il mio stato è quello che mi aspetto.

Tuttavia, per qualche motivo questo codice non verrà compilato. Ottengo il seguente errore:

error: not found: value EmptyID

e

error: not found: value EmptyDescription

Quindi cosa mi sto perdendo? Sto lavorando con " Programmazione in Scala " così se c'è una risposta semplice a questa domanda, per favore dammi una pagina numeri. Non mi dispiace leggere ma seguire il codice a pagina 60 e pagina 62, non riesco a capire perché questo codice non riesce.

Immagino che abbia qualcosa a che fare con il fatto che lo siano metodi di costruzione e che possibilmente le due val non sono inizializzate fino alla fine dei costruttori. Se è così c'è un po ' modo per ottenere l'effetto che sto cercando?

È stato utile?

Soluzione

È possibile definire le costanti in un oggetto associato:

object Task { 
 val EmptyID = 0
 val EmptyDescription = "No Description"
}

E quindi fare riferimento a loro come Task.EmptyID e Task.EmptyDescription.

Penso che Scala 2.8 abbia il supporto per i valori predefiniti.

Altri suggerimenti

Vedi Germ & # 225; n per la risposta. Ciò accade perché un costruttore è tecnicamente parte dell'ambito statico. In altre parole, il costruttore non può accedere ad alcun membro dell'istanza perché l'istanza non è stata ancora creata. Qualsiasi "quot class member" sono in realtà membri dell'istanza, motivo per cui il codice nella domanda non funziona. La risposta di Germ & # 225; n risolve questo problema spostando i due valori rilevanti nell'oggetto associato, il che li rende effettivamente membri statici della classe Task (non proprio, ma puoi pensarlo in quel modo).

In "Programmazione in Scala", vedere la sezione 6.7 in cui è spiegato il concatenamento delle chiamate del costruttore. Il costruttore principale è descritto come "unico punto di ingresso di una classe".

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top