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



我编写了一个名为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实际上只是一个别名。

最新更新