Frage

Ich arbeite Scala lernen - das von einem C ++ Hintergrund. ich versuche eine kleine Klasse für eine Aufgabe Tracking-App schreiben ich Hacking zusammen mir helfen, zu lernen, wie Scala zu codieren.

Dies scheint, als ob es einfach sein sollte, aber aus irgendeinem Grund, mich es eluding:

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

Ich versuche, drei Konstrukteuren zur Verfügung zu stellen: Aufgabe (ID, Beschreibung), Aufgabe (ID), Aufgabe (Beschreibung). In den letzten zwei Fällen mag ich die Werte auf konstante Werte initialisieren, wenn einer der Werte ist nicht vom Anrufer zur Verfügung gestellt. Und ich möchte in der Lage, diese außerhalb zu überprüfen die Klasse für Prüfzwecke Einheit. Also habe ich in zwei Putting Öffentlichkeit vals würde mir erlauben, von außerhalb der Klasse zu überprüfen, um sicher, dass mein Zustand ist das, was ich erwarte.

Doch aus irgendeinem Grund dieser Code nicht kompiliert werden. Ich erhalte die folgende Fehlermeldung:

error: not found: value EmptyID

und

error: not found: value EmptyDescription

Was bin ich dabei? Ich arbeite durch „Programming in Scala“ so wenn es auf diese Frage eine einfache Antwort ist, bitte geben Sie mir Seite Zahlen. Ich habe nichts dagegen zu lesen, sondern durch den Code auf Seite gehen 60 und 62 Seite, ich kann nicht sehen, warum dieser Code versagt.

Ich vermute, es hat etwas mit der Tatsache zu tun, dass diese Konstruktormethoden und dass möglicherweise die beiden vals nicht initialisiert werden bis zum Ende der Konstruktoren. Wenn das der Fall ist, ist es etwas Art und Weise die Wirkung ich suche?

zu bekommen
War es hilfreich?

Lösung

Sie können die Konstanten in einem Begleitobjekt definieren:

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

Und dann verweisen sie als Task.EmptyID und Task.EmptyDescription.

ich glaube, Scala 2.8 Unterstützung hat für Standardwerte.

Andere Tipps

Siehe Germán für die Antwort. Dies geschieht, weil ein Konstruktor ist technisch Teil des statischen Umfang. Mit anderen Worten, Zugriff auf die Konstruktor kann keine Instanz Mitglieder, weil die Instanz noch nicht erstellt wurde. Irgendwelche „Klassenmitglieder“ sind eigentlich Instanz Mitglieder, weshalb der Code in der Frage nicht funktioniert. Germán Antwort korrigiert diese Fehler, indem Sie die beiden relevanten Werte in den Begleitobjekt zu bewegen, die sie effektiv statische Mitglieder der Task Klasse macht (nicht wirklich, aber man kann es denken, dass Art und Weise).

„Programming in Scala“, siehe Abschnitt 6.7, wo die Verkettung von Konstruktoraufrufe erklärt. Der primäre Konstruktor wird als „der einzige Eintrittspunkt einer Klasse“ beschrieben.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top