如何使用Scala import子句从方法参数导入

时间:2012-08-23 16:19:54

标签: scala object traits

我写了一个名为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参数的成员。

1 个答案:

答案 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实际上只是一个别名。)在声明对象的同一行上执行它虽然是非法的语法。