我正在尝试编写一个替换不可变二叉树的左树的便捷函数,并且我在以下replaceL方法中得到“涉及默认参数的应用程序中出错”:
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
}
最佳答案 复制方法(以及一般的默认参数)使用构造函数中使用的名称,而不是您为其分配的字段名称(我不知道为什么这不会更快点击).
在案例类的情况下,分配的字段是无用的;据我所知,他们只是持有对构造函数值的引用的副本(不是我原来的意图).我认为我的困惑源于这样一个事实:在C风格的语言中,给构造函数的变量后来被分配给一个字段.换句话说,我设置课程的方式是非感性的,他们不应该有任何领域.
我的Node类应该简单:
case class Node[K <:Ordered[K],V](k:K, v:V, leftTree:AbNode, rightTree:AbNode) extends AbNode
这允许复制看到我所指的价值.