我写了一个名为Vegetables.scala的Scala源文件。我想从下面的代码中完成的是了解import子句的工作原理。我在Eclipse中输入了这个程序并启动了基于Eclipse的REPL。 我想要做的是创建一个名为Spinach的新对象,它扩展了Vegetable,将其赋值给val并最终调用对象Vegetable的showColor方法,将Spinach对象传递给它。我知道这些例子听起来很荒谬,但我现在只是想了解Scala的概念/机制。为此,我在REPL中做了以下内容:
所以这就是我在REPL上所做的并且出错了。
import com.att.scala.Vegetables._
import java.awt.Color
val obj = object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
<console>:1: error: illegal start of simple expression
val obj = object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
^
Vegetable.scala的代码如下:
package com.att.scala
import java.awt.Color
trait Vegetable {
val name: String
val color: Color
}
object Vegetables {
object Asparagus extends Vegetable {
val name = "Asparagus"
val color = Color.GREEN
}
object Carrot extends Vegetable {
val name = "Carrot"
val color = Color.ORANGE
}
val veggiePlatter = List(Asparagus, Carrot)
def showColor(veggie: Vegetable) {
import veggie._
println("Entered showColor")
import veggie._
println("veggie color is " + color)
}
}
什么可以解释这个错误?首先,我试图了解在REPL上创建对象的正确方法是什么,然后将其分配给val。一旦完成,我希望在参数中传递val。然后,我想测试showColor中的import子句,看它是否确实导入了veggie参数的成员。
答案 0 :(得分:2)
定义对象就像定义静态成员或类。您无法声明它并同时将其分配给变量。 (事实上,您并不需要,因为在定义对象之后,已经可以通过其名称访问该对象。)
因此,您的示例将在REPL中起作用:
import com.att.scala.Vegetables._
import java.awt.Color
object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
将定义一个名为Spinach
的对象。之后,您可以致电Vegetables.showColor(Spinach)
来实现您的初始目标。
如果您真的想将其分配给变量,可以在声明对象后调用val obj = Spinach
,这有效(尽管不是特别有用)Spinach
已经是一个明确的名称对于那件事,obj
实际上只是一个别名。)在声明对象的同一行上执行它虽然是非法的语法。