Question

Je travaille pour apprendre Scala - issu d'un environnement C ++. j'essaie d'écrire une petite classe pour une application de suivi des tâches, je piratage ensemble pour aidez-moi à apprendre à coder Scala.

Cela semble être simple, mais pour une raison quelconque, cela m'échappe:

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)
 }
}

J'essaie de fournir trois constructeurs: Task (ID, Description), Tâche (ID), tâche (Description). Dans les 2 derniers cas je veux initialiser les valeurs à des valeurs constantes si l'une des valeurs n'est pas fournie par l'appelant. Et je veux pouvoir vérifier cela à l'extérieur de la classe à des fins de tests unitaires. Alors j'ai pensé mettre en deux vals publics me permettrait de vérifier de l'extérieur de la classe pour faire que mon état correspond à mes attentes.

Cependant, pour une raison quelconque, ce code ne sera pas compilé. J'obtiens l'erreur suivante:

error: not found: value EmptyID

et

error: not found: value EmptyDescription

Alors, qu'est-ce qui me manque? Je travaille sur "Programmation en Scala". alors s'il y a une réponse simple à cette question, donnez-moi s'il vous plaît page Nombres. Cela ne me dérange pas de lire, mais en respectant le code de la page 60 et page 62, je ne vois pas pourquoi ce code échouait.

Je suppose que cela a quelque chose à voir avec le fait que ce sont méthodes constructeur et que éventuellement les deux valeurs ne sont pas initialisées jusqu'à la fin des constructeurs. Si tel est le cas, y a-t-il des moyen d'obtenir l'effet que je recherche?

Était-ce utile?

La solution

Vous pouvez définir les constantes dans un objet compagnon:

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

Et faites ensuite référence à eux en tant que Task.EmptyID et Task.EmptyDescription.

Je pense que Scala 2.8 prend en charge les valeurs par défaut.

Autres conseils

Voir Germán pour la réponse. Cela se produit car un constructeur fait techniquement partie de la portée statique. En d'autres termes, le constructeur ne peut accéder à aucun membre d'instance, car l'instance n'a pas encore été créée. Tout "membre de la classe" " sont en fait des membres d'instance, ce qui explique pourquoi le code de la question ne fonctionne pas. La réponse de Germán résout ce problème en déplaçant les deux valeurs pertinentes dans l'objet compagnon, ce qui en fait des membres statiques de la classe Task (pas vraiment, mais vous pouvez le voir ainsi).

Dans "Programmation en Scala", voir la section 6.7 où est présenté le chaînage des appels de constructeur. Le constructeur principal est décrit comme "le point d'entrée unique d'une classe".

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top