Использовать переменные класса как константы В 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 не инициализируются
до конца конструкторов. Если в этом случае есть некоторые
способ получить эффект, который я ищу?
Ответы
Ответ 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, где объясняется цепочка вызовов конструктора. Основной конструктор описывается как "единственная точка входа класса".