Scala中的伴随对象不与案例类相关联

Kal*_*ope 3 factory scala object apply

我在理解为什么这段代码不起作用时遇到了一些麻烦.我从二叉树中的99个Scala问题中得到了它(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)
Run Code Online (Sandbox Code Playgroud)

如果我删除两个Ends,我没有得到任何编译错误,但如果我创建一个具有单个值的Node,我会陷入无限循环.所以看起来应用就是构造更多的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)
}
Run Code Online (Sandbox Code Playgroud)

Arj*_*ijl 12

适合我(见下文).你有没有在同一个文件中定义它们?


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>
Run Code Online (Sandbox Code Playgroud)

编辑 从你的评论:它看起来像:loadrepl中的命令一个接一个地解释文件中的每一行,你可以在这里找到它的代码.但是这不能使用REPL,因为(我相信)每个被解释的行都会在自己的包中编译.有关详细信息,请参阅此主题.也许这可能是REPL的未来增强.但原则上,您的代码没有任何问题:使用两种: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.
Run Code Online (Sandbox Code Playgroud)

NB我在JIRA上找不到任何增强请求,所以我创建了这个问题