0

我编写了一个名为 Vegetables.scala 的 Scala 源文件。我试图从下面的代码中完成的是了解导入子句的工作原理。我在 Eclipse 中输入了这个程序并启动了基于 Eclipse 的 REPL。我想做的是创建一个名为 Spinach 的新对象,它扩展了蔬菜,将其分配给一个 val 并最终调用对象蔬菜的 showColor 方法,将菠菜对象传递给它。我知道这些例子听起来很荒谬,但我现在只是试图理解 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 参数的成员。

4

1 回答 1

3

定义一个对象就像定义一个静态成员或一个类。您不能同时声明它并将其分配给变量。(事实上​​你并不需要,因为对象在定义之后就可以通过它的名字访问了。)

因此,您的示例将在 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实际上只是一个别名。)。在声明对象的同一行上执行此操作是非法的语法。

于 2012-08-23T16:27:44.467 回答