我很难理解为什么这段代码不起作用。我从二进制树部分的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)
如果我删除两个Ends,我不会得到任何编译错误,但如果我用一个值创建一个Node,我会陷入无限循环。因此,看起来application正在构造更多的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
命令会逐一解释文件中的每一行,您可以在这里找到相应的代码。然而,使用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.
注意。我在JIRA上找不到任何增强请求,所以我创建了这个问题