我编写了一个名为Vegetables.Scala的Scala源文件。我试图从下面的代码中实现的是了解导入子句的工作原理。我在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子句,看看它是否真的导入了素食参数的成员。
定义对象就像定义静态成员或类。不能同时声明它和将它赋值给一个变量。(事实上,你并不真的需要这样做,因为对象在定义后就可以通过其名称访问了。)
因此,您的示例在REPL中的工作方式为:
import com.att.scala.Vegetables._
import java.awt.Color
object Spinach extends Vegetable { val name = "Spinach" val color = Color.GREEN }
其将定义称为CCD_ 1的对象。之后,您可以调用Vegetables.showColor(Spinach)
来实现您的初始目标。
如果你真的想把它分配给一个变量,你可以在声明对象后调用val obj = Spinach
,这是有效的(尽管不是特别有用-Spinach
已经是一个明确的名称,obj
实际上只是一个别名。