Подтвердить что ты не робот

Использовать переменные класса как константы В Scala

Я работаю, чтобы узнать Scala - исходя из фона С++. я пытаюсь написать небольшой класс для приложения отслеживания задач. Я взламываю помогите мне узнать, как закодировать Scala.

Кажется, что это должно быть просто, но почему-то это ускользает от меня:

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

Я пытаюсь предоставить три конструктора: Task (ID, Description), Задача (ID), Задача (Описание). В последних двух случаях я хочу инициализировать значения до постоянных значений, если одно из значений не предоставленный абонентом. И я хочу, чтобы проверить это снаружи класса для целей единичного тестирования. Поэтому я решил положить в два public vals позволили бы мне проверить извне класса, чтобы сделать что мое состояние - это то, что я ожидаю.

Однако по какой-то причине этот код не будет компилироваться. Я получаю следующую ошибку:

error: not found: value EmptyID

и

error: not found: value EmptyDescription

Так что мне не хватает? Я работаю через "Программирование в Scala", поэтому если есть простой ответ на этот вопрос, пожалуйста, дайте мне страницу номера. Я не против читать, но просматриваю код на стр. 60 и стр. 62, я не понимаю, почему этот код не работает.

Я предполагаю, что это имеет какое-то отношение к тому, что это методы конструктора и что, возможно, два vals не инициализируются до конца конструкторов. Если в этом случае есть некоторые способ получить эффект, который я ищу?

4b9b3361

Ответ 1

Вы можете определить константы в сопутствующем объекте:

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

И затем ссылайтесь на них как на Task.EmptyID и Task.EmptyDescription.

Я думаю, что Scala 2.8 поддерживает значения по умолчанию.

Ответ 2

См. Герман за ответ. Это происходит потому, что конструктор является технически частью статической области. Другими словами, конструктор не может получить доступ к каким-либо членам экземпляра, потому что экземпляр еще не создан. Любые "члены класса" на самом деле являются членами экземпляра, поэтому код в вопросе не работает. Ответ Germán исправляет это, перемещая два соответствующих значения в объект-компаньон, что фактически делает их статическими членами класса Task (на самом деле, но вы можете так думать).

Ответ 3

В разделе "Программирование в Scala" см. раздел 6.7, где объясняется цепочка вызовов конструктора. Основной конструктор описывается как "единственная точка входа класса".