2012-08-23 56 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