2012-08-23 100 views
0

我编写了一个名为Vegetables.scala的Scala源文件。我试图从下面的代码中完成的是了解import子句是如何工作的。我在Eclipse中输入了这个程序并启动了基于Eclipse的REPL。 我想要做的是创建一个名为Spinach的新对象,该对象扩展了Vegetable,将其分配给val并最终调用对象Vegetable的showColor方法,将Spinach对象传递给它。我知道这些例子听起来很荒谬,但我现在只是试图理解Scala的概念/机制。为此,我在REPL中做了以下操作:如何使用Scala导入子句从方法参数导入

所以这就是我在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参数的成员。

回答

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将有效只是一个别名。)。在同一行上做这件事,你声明该对象虽然是非法的语法。

+3

'val s = Seq' - 你可以给一个变量分配一个单例对象。 – axel22

+0

这是我不知道的事实。感谢您将菠菜分配给变量的更新 – ilango

+0

谢谢,axel22 – ilango