Pergunta

Eu estou trabalhando para aprender Scala - vindo de um fundo C ++. eu estou tentando para escrever uma pequena classe para um aplicativo de rastreamento tarefa que eu estou cortando em conjunto para me ajudar a aprender a código Scala.

Isto parece como se ele deve ser simples, mas por algum motivo isso está me iludindo:

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

Eu estou tentando fornecer três construtores: Task (ID, Descrição), Tarefa (ID), Task (Descrição). Nos últimos 2 casos que eu quero inicializar os valores a valores constantes, se um dos valores não é fornecido pelo chamador. E eu quero ser capaz de verificar isso fora da classe para fins de teste unidade. Então eu percebi colocando em dois vals públicas me permitisse verificar de fora da classe para fazer certeza que o meu estado é o que eu espero.

No entanto, por alguma razão, este código não irá compilar. Eu recebo o seguinte erro:

error: not found: value EmptyID

e

error: not found: value EmptyDescription

Então, o que eu estou ausente? Estou trabalhando através de "Programação em Scala" de modo se há uma resposta simples para esta pergunta, por favor me dê página números. Eu não me importo de ler, mas indo pelo código na página 60 e página 62, eu não posso ver por que este código está falhando.

Eu estou supondo que tem algo a ver com o fato de que estes são métodos construtores e que, possivelmente, os dois vals não são inicializados até o fim dos construtores. Se for esse o caso há algum maneira de obter o efeito que eu estou procurando?

Foi útil?

Solução

Você pode definir as constantes em um objeto companheiro:

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

E, em seguida, fazer referência a eles como Task.EmptyID e Task.EmptyDescription.

Eu acho Scala 2.8 tem suporte para valores padrão.

Outras dicas

Veja Germán para a resposta. Isso acontece porque um construtor é tecnicamente parte do escopo estático. Em outras palavras, o construtor não pode acessar quaisquer membros de instância porque a instância não foi criado ainda. Qualquer "os membros da classe" são realmente membros de instância, que é por isso que o código em questão não funciona. resposta correções do alemão isso movendo os dois valores relevantes para o objeto companheiro, o que efetivamente torna membros estáticos da classe Task (não realmente, mas você pode pensar dessa forma).

Em "Programação em Scala", consulte a secção 6.7, onde o encadeamento de chamadas do construtor é explicado. O construtor primário é descrito como "o único ponto de entrada de uma classe".

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top