“尝试使用Scala的复制方法时,在涉及默认参数的应用程序中出错”

我正在尝试编写一个替换不可变二叉树的左树的便捷函数,并且我在以下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

这允许复制看到我所指的价值.

点赞