在Scala(EclipseIDE)中使用trait和companion对象时返回值时出现问题
我已将以下代码放入Eclipse中的object.Scala文件中,只想知道“x”的值是多少(应该是3)。如果我将值放置在列表对象之外的任何位置,代码将不会编译;同时,在列表对象中运行文件时,不会产生任何输出在Scala(EclipseIDE)中使用trait和companion对象时返回值时出现问题,scala,main,traits,companion-object,Scala,Main,Traits,Companion Object,我已将以下代码放入Eclipse中的object.Scala文件中,只想知道“x”的值是多少(应该是3)。如果我将值放置在列表对象之外的任何位置,代码将不会编译;同时,在列表对象中运行文件时,不会产生任何输出 package work object Work extends App { // These 3 lines define a simplified List type sealed trait List[+A] case object Nil extends List[N
package work
object Work extends App {
// These 3 lines define a simplified List type
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
// This companion object contains basic operations for the List type
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
// The next line is the value that I want to return.
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + sum(t)
case _ => 101
}
}
}
最初,我将所有内容都放在对象Work extends App
中,以便对其进行编译,否则编译器会抱怨我缺少一个Main方法。但是,为了让“x”返回,我尝试放弃工作对象,而是在我希望看到的表达式中添加了一个Main方法,如下所示:
def main(args: Array[String]) {
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y case Cons(h, t) => h + sum(t)
case _ => 101
}
}
但是,我随后得到以下错误:
List具有参数类型为Array[String]的main方法,但
work.List将不是可运行的程序。理由:伴侣是一个朋友
trait,这意味着无法生成静态转发器
我不太清楚这是什么意思。对于如何正确地实现Main方法,我也非常困惑。我试图在List对象的正下方添加一个Main方法,封装List的所有定义和val x,结果导致了比上面更多的错误。我很困惑,还在网上搜索答案,但到目前为止,似乎没有任何东西能解决我的特定问题
任何帮助都将不胜感激
下面是我的原始帖子,包含更多信息,包括我正在做的练习的文本。要做这个练习,我需要看看表达式是如何计算的。正是出于这个原因,我通常在Scala工作表中工作,因为我可以在几秒钟内看到我的结果,但是这个特殊的练习涉及到使用一个trait和companion对象,它们的添加对我来说非常复杂,因为我知道它们在代码中是如何使用的,我不知道如何正确实施它们。
原职
我将以下代码放入EclipseIDE的Scala工作表中,然后花了大约两个小时尝试不同的方法来实现它
defmain(args:Array[String){}
或对象是如何扩展App{}
实际工作,我知道他们允许代码实际编译和运行。同时,Scala工作表过去从未要求我有一个Main方法,尽管过去我也没有在同一个文件中使用类或特征。我知道我一定遗漏了什么
我试过了
- 使用App扩展列表对象
- 或者在其下面添加def主参数
- 为sealed trait创建一个名为“Classes”的对象并向其添加主参数
- 或者用App扩展它
- 创建一个较大的对象“工作表”,然后在def主参数下添加以下所有内容
- 或使用应用程序扩展“工作表”
- 在另一个EclipseIDE文件中,创建一个新的Scala Trait,在其中添加Trait和类代码,然后尝试将其导入到工作表中,意识到伴随对象列表需要存在于同一个文件中
- 将上述所有代码放入另一个文件中,尝试将该文件导入工作表,并尝试使任何列表操作正常工作(这里的问题是,我实际上不知道下面的代码属于Eclipse IDE中的哪种类型的Scala文件、对象、类或特征)
非常感谢您抽出时间。我不知道您为什么提到将
val x
放在列表对象之外会阻止您进行编译
下面编译并生成预期输出=3
object Work extends App {
// These 3 lines define a simplified List type
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
// This companion object contains basic operations for the List type
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
// The next line is the value that I want to return.
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + List.sum(t)
case _ => 101
}
println(x)
}
我也不知道为什么。我想我尝试了太多不同的迭代,以至于当我将val x放在List对象之外时,其他东西在干扰。无论如何,在我意识到我在Eclipse中运行的文件错误后,您的代码运行了;非常感谢您的帮助!啊,我意识到了原因。这是因为我是一个新手,不太了解在分析对象和类的工作方式时,将val x置于列表对象之外,同时又去掉了工作对象,这导致Scala抱怨说,它希望在val x所在的位置有一个类或对象定义。当时我不确定如何实际解决这个问题,但由于您的代码向我展示了正确编译代码的样子,我不得不e有了更好的理解,现在我找到了另一种方法让我的代码编译并返回一个值。
object Work extends App {
// These 3 lines define a simplified List type
sealed trait List[+A]
case object Nil extends List[Nothing]
case class Cons[+A](head: A, tail: List[A]) extends List[A]
// This companion object contains basic operations for the List type
object List {
def sum(ints: List[Int]): Int = ints match {
case Nil => 0
case Cons(x,xs) => x + sum(xs)
}
def product(ds: List[Double]): Double = ds match {
case Nil => 1.0
case Cons(0.0, _) => 0.0
case Cons(x,xs) => x * product(xs)
}
def apply[A](as: A*): List[A] =
if (as.isEmpty) Nil
else Cons(as.head, apply(as.tail: _*))
}
// The next line is the value that I want to return.
val x = List(1,2,3,4,5) match {
case Cons(x, Cons(2, Cons(4, _))) => x
case Nil => 42
case Cons(x, Cons(y, Cons(3, Cons(4, _)))) => x + y
case Cons(h, t) => h + List.sum(t)
case _ => 101
}
println(x)
}