2015-06-11 3 views
1

У меня есть этот кодОбновление значения узла в Scala?

tree match { 
      case EmptyNode => 
       //do stuff with empty node 
      case Node(left, right, value) => 
       //do stuff with node contents 
} 

Однако то, что если я хочу, чтобы обновить значение узла? Я пробовал делать значение = newValue внутри дела, но, похоже, это не разрешено.

Структура моих деревьев/узлов:

sealed trait Tree 
case class Node(var left: Tree, var right: Tree, var value: String) extends Tree 
case object EmptyNode extends Tree 

ответ

4

Вы можете ссылаться на фактический узел с @ нотации:

case [email protected](left, right, value) => n.value = "newValue" 
1

ответ Ноев действительно показывает, как изменить значение узла, но вы не должны этого делать. Одной из основных идей scala является продвижение неизменяемых структур данных, то есть как только вы определяете объект, вы его не изменяете.

Это особенно важно в дереве, потому что, изменяя значение узла, вы потенциально делаете свое дерево непоследовательным (значения слева от узла больше не могут быть меньше). Вместо этого всегда сохраняйте значения узлов неизменяемыми и добавляйте или удаляйте узлы по мере необходимости, учитывая перебалансировку дерева при удалении узла.

+0

Да, я согласен с вами, но пользователь спросил [связанный вопрос вчера] (https://stackoverflow.com/questions/30769983/making-a-very-basic-binary-tree-in-scala), где он стало ясно, что пользователь просто учится программировать и будет иметь проблемы с обновлением неизменяемых деревьев классов case (он удалил свой комментарий, говоря, что ему не нравятся неизменные структуры). Это всего лишь дополнительная информация о том, почему пользователь хочет использовать изменяемые деревья. –

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