0

Допустит, у меня есть структура данных, которая содержит параметризованные типы данных:Scala с использованием класса аргумента заполнитель (или входной переменный)

case class Terminal[A](value: A, name: String ="") 

Я могу легко создать Terminal[Double] если я передать его материализованный постоянным :

val terminal = Terminal(2.0) 

Однако, я хочу, чтобы быть в состоянии получать (не материализовались) input, так что я могу оценить терминальные несколько раз с различными контекстами. Я могу достичь простое решение, вызвав value по имени, т.е.

class Terminal[A](value: => A, name: String ="") { 
    def getValue = this.value 
} 

var x = 1.0 

val terminal = new Terminal(x) 

terminal.getValue // 1.0 

x = 100.0 

terminal.getValue // 100.0 

Однако пользователь этой программы будет иметь инициализацию input с чем-то вроде var input_x = None, что не хорошо, а затем изменить его состояние, которое в поворот заставил бы меня превратить value в Option[A]

Это лучший способ справиться с этой ситуацией? Является ли какой-либо шаблон дизайна или функция scala, которую я мог бы использовать?

Я также могу создать класс Input для представления этих зависимых от контекста входов, но тогда мне нужно будет многое изменить.

+0

У вас возникли проблемы с попыткой применить конкретное решение проблемы. Беда в том, что вы просите о помощи в реализации своего решения, которое, конечно же, неверно, но никогда не описывайте фактическую проблему, которую вы пытаетесь решить. Я предлагаю вам сделать шаг назад и попытаться описать, почему (как вы думаете) вам нужен этот класс «Терминал» и как его можно использовать в реальной жизни. – Dima

ответ

1

Вы можете использовать неизменные объекты, как показано ниже:

scala> case class Terminal[A](value: A, name: String ="") { 
    | def update(newValue: A): Terminal[A] = this.copy(value = newValue) 
    | def getValue: A = this.value 
    | } 
defined class Terminal 

scala> val terminal = Terminal(1.0) 
terminal: Terminal[Double] = Terminal(1.0,) 

scala> val updatedTerminal = terminal.update(100.0) 
updatedTerminal: Terminal[Double] = Terminal(100.0,) 

scala> val oldValue = terminal.getValue 
oldValue: Double = 1.0 

scala> val newValue = updatedTerminal.getValue 
newValue: Double = 100.0 

Метод GetValue на самом деле лишний здесь, потому что добытчики приходят бесплатно с case classes. Я просто попробовал это, чтобы продемонстрировать пример.

scala> oldValue == terminal.value 
res0: Boolean = true 

scala> newValue == updatedTerminal.value 
res1: Boolean = true 

В общем, предпочитает тематические классы, если вы хотите создать объекты, которые не имеют изменяемое состояния (например, все одноэлементные компоненты зажиточные как не тематические классы).

 Смежные вопросы

  • Нет связанных вопросов^_^