Используйте Переменные класса В качестве Констант В Scala
Вопрос
Я работаю над изучением Scala, исходя из опыта работы на C ++.Я пытаюсь написать небольшой класс для приложения для отслеживания задач, которое я взламываю вместе, чтобы помочь мне научиться программировать 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(Описание).В последних 2 случаях я хочу инициализировать значения постоянными значениями, если одно из значений не предоставлено вызывающей стороной.И я хочу быть в состоянии проверить это вне класса для целей модульного тестирования.Поэтому я решил, что добавление двух общедоступных значений val позволит мне проверять извне класса, чтобы убедиться, что мое состояние соответствует моим ожиданиям.
Однако по какой-то причине этот код не будет компилироваться.Я получаю следующую ошибку:
error: not found: value EmptyID
и
error: not found: value EmptyDescription
Так что же я упускаю из виду?Я работаю над "Программированием в Scala", поэтому если есть простой ответ на этот вопрос, пожалуйста, дайте мне номера страниц .Я не против почитать, но, просматривая код на стр. 60 и стр. 62, я не понимаю, почему этот код не работает.
Я предполагаю, что это как-то связано с тем фактом, что это методы конструктора и что, возможно, два val не инициализируются до конца конструкторов.Если это так, есть ли какой-нибудь способ получить эффект, который я ищу?
Решение
Вы можете определить константы в сопутствующем объекте:
object Task {
val EmptyID = 0
val EmptyDescription = "No Description"
}
А затем ссылайтесь на них как на Task.EmptyID и Task.EmptyDescription.
Я думаю, что Scala 2.8 поддерживает значения по умолчанию.
Другие советы
Ответ можно найти у Германа.Это происходит потому, что конструктор является технически часть статической области видимости.Другими словами, конструктор не может получить доступ ни к каким элементам экземпляра, поскольку экземпляр еще не создан.Любые "члены класса" на самом деле являются членами экземпляра, вот почему код в вопросе не работает.Ответ Германа исправляет это, перемещая два соответствующих значения в сопутствующий объект, что фактически делает их статическими членами Task
класс (не совсем, но вы можете думать об этом и так).
В разделе "Программирование в Scala" смотрите раздел 6.7, где объясняется объединение вызовов конструктора в цепочку.Основной конструктор описывается как "единственная точка входа в класс".