Pregunta

Estoy trabajando para aprender Scala, proveniente de un fondo de C ++. estoy intentando para escribir una clase pequeña para una aplicación de seguimiento de tareas Estoy hackeando juntos para Ayúdame a aprender cómo codificar Scala.

Esto parece que debería ser simple, pero por alguna razón me está eludiendo:

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

Estoy tratando de proporcionar tres constructores: Tarea (ID, Descripción), Tarea (ID), Tarea (Descripción). En los 2 últimos casos quiero Inicialice los valores a valores constantes si uno de los valores no es proporcionado por la persona que llama. Y quiero poder comprobar esto fuera. de la clase para propósitos de prueba de unidad. Así que pensé poner en dos vals públicos me permitirían verificar desde fuera de la clase para hacer Seguro que mi estado es lo que espero.

Sin embargo, por alguna razón, este código no se compilará. Recibo el siguiente error:

error: not found: value EmptyID

y

error: not found: value EmptyDescription

Entonces, ¿qué me estoy perdiendo? Estoy trabajando a través de " Programación en Scala " asi que Si hay una respuesta simple a esta pregunta, por favor, dame una página. números. No me importa leer, pero siguiendo el código de la página 60 y página 62, no puedo ver por qué este código está fallando.

Supongo que tiene algo que ver con el hecho de que estos son métodos de construcción y que posiblemente los dos vals no están inicializados Hasta el final de los constructores. Si ese es el caso, ¿hay alguna ¿Cómo obtener el efecto que estoy buscando?

¿Fue útil?

Solución

Puede definir las constantes en un objeto complementario:

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

Y luego haz referencia a ellos como Task.EmptyID y Task.EmptyDescription.

Creo que Scala 2.8 tiene soporte para los valores predeterminados.

Otros consejos

Ver Germ & # 225; n para la respuesta. Esto sucede porque un constructor es técnicamente parte del alcance estático. En otras palabras, el constructor no puede acceder a ningún miembro de la instancia porque la instancia aún no se ha creado. Cualquier " miembros de la clase " en realidad son miembros de instancia, por lo que el código en la pregunta no funciona. La respuesta de Germ & # 225; n corrige esto al mover los dos valores relevantes al objeto compañero, lo que efectivamente los convierte en miembros estáticos de la clase Task (no realmente, pero puedes pensar de esa manera).

En " Programación en Scala " ;, vea la sección 6.7 donde se explica el encadenamiento de las llamadas del constructor. El constructor principal se describe como "el único punto de entrada de una clase".

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top