2014-12-09 3 views
3

Я пытаюсь написать функцию удобства, которая заменяет левое дерево неизменяемого двоичного дерева, и я получаю "Error occurred in an application involving default arguments" в следующих replaceL метод:«Ошибка при попытке использования аргументов по умолчанию» при попытке использования метода копирования Scala

abstract class AbNode { 
    val key = null 
    val value = null 

    val leftTree:AbNode = NullNode 
    val rightTree:AbNode = NullNode 
} 

case class Node[K <:Ordered[K],V](k:K, v:V, lT:AbNode, rT:AbNode) extends AbNode { 
    val key:K = k 
    val value:V = v 

    val leftTree:AbNode = lT 
    val rightTree:AbNode = rT 
} 

object Node { 
    def replaceL[K <: Ordered[K],V](newTree:AbNode, node:Node[K,V]): Node[K,V] = 
     node.copy(leftTree = newTree) //<< Error occurs here 
} 

case object NullNode extends AbNode { 
    val key = null 
    val value = null 

    val leftTree = NullNode 
    val rightTree = NullNode 
} 

ответ

2

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

В случае case class назначенные поля бесполезны; насколько я могу судить, они просто держат копию ссылки на значение конструктора (не мое первоначальное намерение). Я думаю, что моя путаница связана с тем, что в языках C-типа переменные, переданные конструктору, впоследствии назначаются полю. Другими словами, способ, которым я устанавливаю свои классы, нечувствителен, у них не должно быть полей. Мой класс Node должен быть просто:

case class Node[K <:Ordered[K],V](k:K, v:V, leftTree:AbNode, rightTree:AbNode) extends AbNode 

Что позволяет copy видеть значение я имею в виду.

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