Чисто создавать новые экземпляры типа, используя значения в существующем экземпляре - PullRequest
0 голосов
/ 10 марта 2019

Я пытаюсь изучить Scala и стараюсь придерживаться неизменного принципа при создании объектов.

У меня есть класс Scala, определенный как:

class TDay(date: LocalDate, open: Double, high: Double,
           low: Double, close: Double, tr1: Double = 0.0, tr14: Double = 0.0)
{

}

Параметры date, open, high, low и close - это все значения, которые я знаю во время создания любого экземпляра TDay, но tr1 и tr14 - это значения, которые должны быть рассчитаны, а tr1 - из open, high, low и close и tr14 вычисляются из серии tr1 значений, полученных из других TDay экземпляров.

Если бы я кодировал это на Java, я бы с удовольствием вычислил значения tr1 и tr14 и поместил бы их в такой же объект. Но если я собираюсь сделать это 'способом Scala', я предполагаю, что мне нужно будет создавать новые TDay экземпляры каждый раз, когда я хочу вычислить tr1 или tr14 для данного TDay экземпляра.

Я мог бы перегрузить конструктор TDay:

def this(tDay: TDay, tr1: Double)
    {
        this(tDay.date, tDay.open, tDay.high, tDay.low, tDay.close,
        tr1, tDay.tr14)
    }

Но это означает, что я уже определил конструктор сигнатуры (TDay, Double), поэтому не могу перегрузить снова, чтобы установить значение tr14. На самом деле мой пример здесь упрощен, и у меня есть еще несколько Double значений, которые мне нужно вычислить и установить каждое из них должно быть выполнено в определенном порядке.

Есть ли чистый способ создания нового экземпляра TDay, используя значения из уже существующего и устанавливая новое вычисленное значение в то же время, без того, чтобы код становился многословным? Или подход к проблеме требует переосмысления?

1 Ответ

2 голосов
/ 10 марта 2019

Вы можете сделать это case class, что будет обычным способом представления простой записи, подобной этой:

case class TDay(date: LocalDate, open: Double, high: Double,
                low: Double, close: Double, tr1: Double = 0.0, tr14: Double = 0.0)

Затем вы можете использовать метод copy для создания копии с обновленнымэлементы:

val td: TDay = ...
val tdNew = td.copy(tr1 = ..., tr14 = ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...