Используйте Переменные класса В качестве Констант В Scala

StackOverflow https://stackoverflow.com/questions/803206

  •  03-07-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top