sintaxis objetos objeto introduccion syntax scala

syntax - objetos - scala sintaxis



Usar variables de clase como constantes en Scala (3)

Estoy trabajando para aprender Scala, proveniente de un fondo de C ++. Estoy tratando de escribir una clase pequeña para una aplicación de seguimiento de tareas. Estoy pirateando juntos para ayudarme a aprender cómo codificar Scala.

Esto parece como si debería ser simple, pero por alguna razón me elude:

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 últimos 2 casos, quiero inicializar los valores a valores constantes si el llamante no proporciona uno de los valores. Y quiero poder verificar esto fuera de la clase para propósitos de prueba de unidad. Así que pensé que poner dos valores públicos me permitiría verificar desde fuera de la clase para asegurarme de que mi estado es lo que esperaba.

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

error: not found: value EmptyID

y

error: not found: value EmptyDescription

Entonces, ¿qué me estoy perdiendo? Estoy trabajando en "Programación en Scala", así que si hay una respuesta simple a esta pregunta, por favor, dame los números de página. No me importa leer, pero siguiendo el código de la página 60 y la 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 valores no estén inicializados hasta el final de los constructores. Si ese es el caso, ¿hay alguna manera de obtener el efecto que estoy buscando?


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


Puedes definir las constantes en un objeto compañero:

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

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

Creo que Scala 2.8 tiene soporte para valores por defecto.


Ver a Germán por la respuesta. Esto sucede porque un constructor es técnicamente parte del ámbito 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. Todos los "miembros de la clase" son en realidad miembros de la instancia, por lo que el código en la pregunta no funciona. La respuesta de Germán soluciona esto al mover los dos valores relevantes al objeto compañero, lo que efectivamente los convierte en miembros estáticos de la clase de Task (no realmente, pero se puede pensar de esa manera).