gpt4 book ai didi

scala - Scala 中的伴生对象未将自身与案例类关联

转载 作者:行者123 更新时间:2023-12-03 03:31:03 25 4
gpt4 key购买 nike

我无法理解为什么这段代码不起作用。我从二叉树部分的 99 Scala Problems (http://aperiodic.net/phil/scala/s-99/) 中得到它。它对我来说看起来是有效的:Node 对象是 Node 类的伴生对象,并且它为树上的叶子添加了一个构造函数。但是当我尝试编译它时,我得到以下结果:

<console>:10: error: too many arguments for method apply: (value: T)Node[T] in object Node

def apply[T](value: T): Node[T] = Node(value, End, End)

如果我删除两端,我不会收到任何编译错误,但如果我创建一个具有单个值的节点,我就会陷入无限循环。所以看起来 apply 正在构造更多 Node 对象,并且没有将自身与 Node 类关联起来。

感谢任何帮助。

sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
override def toString = "."
}
object Node {
def apply[T](value: T): Node[T] = Node(value, End, End)
}

最佳答案

对我有用(见下文)。您是否在同一个文件中定义了它们?


Welcome to Scala version 2.9.0.final (Java HotSpot(TM) 64-Bit Server VM, Java 1.6.0_24).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :paste
// Entering paste mode (ctrl-D to finish)

sealed abstract class Tree[+T]
case class Node[+T](value: T, left: Tree[T], right: Tree[T]) extends Tree[T] {
override def toString = "T(" + value.toString + " " + left.toString + " " + right.toString + ")"
}
case object End extends Tree[Nothing] {
override def toString = "."
}
object Node {
def apply[T](value: T): Node[T] = Node(value, End, End)
}

// Exiting paste mode, now interpreting.

defined class Tree
defined class Node
defined module End
defined module Node

scala> Node("123")
res0: Node[java.lang.String] = T(123 . .)

scala>

编辑从您的评论来看:看起来 repl 中的 :load 命令逐一解释文件中的每一行,您可以找到该代码 here 。然而,这在使用 REPL 时不起作用,因为(我相信)解释的每一行都会在自己的包中编译。请参阅this thread更多细节。也许这可能是 REPL future 的增强功能。但原则上,您的代码没有任何问题:使用 :paste 模式或仅使用 scalac 编译都可以正常工作。


scala> case class A(i: Int, i2: Int)
defined class A

scala> object A {
| def apply(i: Int): A = A(i, i)
| }
:25: error: too many arguments for method apply: (i: Int)A in object A
def apply(i: Int): A = A(i, i)

scala> object A {
def apply(i: Int): A = new A(i, i)
}
defined module A
warning: previously defined class A is not a companion to object A.
Companions must be defined together; you may wish to use :paste mode for this.

注意我在 JIRA 上找不到任何增强请求,因此我创建了 this issue

关于scala - Scala 中的伴生对象未将自身与案例类关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6287550/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com