Используйте переменные класса как константы в Scala - PullRequest
19 голосов
/ 29 апреля 2009

Я работаю над изучением 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 (ID, Description), Задача (ID), Задача (Описание). В последних 2 случаях я хочу инициализировать значения постоянными значениями, если одно из значений не предоставленный абонентом. И я хочу иметь возможность проверить это снаружи класса для целей модульного тестирования. Так что я решил положить в два public vals позволил бы мне проверить извне класса, чтобы сделать уверен, что мое состояние соответствует ожиданиям.

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

error: not found: value EmptyID

и

error: not found: value EmptyDescription

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

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

Ответы [ 3 ]

39 голосов
/ 29 апреля 2009

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

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

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

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

8 голосов
/ 30 апреля 2009

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

1 голос
/ 03 мая 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...