2011-12-30 73 views
4

從一個例子「開頭的斯卡拉」的腳本是:不能在書編譯文件中斯卡拉

import scala.collection.mutable.Map 

object ChecksumAccumulator { 
private val cache=Map[String,Int]() 
def calculate(s: String):Int = 
    if(cache.contains(s)) 
    cache(s) 
    else{ 
    val acc = new ChecksumAccumulator 
    for(c <- s) 
     acc.add(c.toByte) 
    val cs=acc.checksum 
     cache+= (s -> cs) 
    cs 
    } 
} 

,但是,當我試圖編譯該文件 $ scalac ChecksumAccumulator.scala,然後產生一個錯誤,「找不到:輸入ChecksumAccumulator val acc = new ChecksumAccumulator」,有什麼建議?

謝謝,

回答

2

您的問題就在這裏

val acc = new ChecksumAccumulator 

你不能使用new關鍵字與對象。 對象不能被重新實例化。你總是在scala中有一個對象的單個實例。這與java中的靜態成員類似。

3

你可能留下一些代碼出來,看起來像

類ChecksumAccumulator { // ... }

0

您的代碼,可能是指作爲一個companion對象。這是命令式語言中的factories

Basicaly,你有對象對。 Object(singleton in imperative langs)不能被多次實例化,正如人們在這裏已經注意到的,並且通常用於定義一些靜態邏輯。事實上,只有一個實例 - 當你第一次給他打電話時。但對象可以有比較 - 普通類,並且,因爲我認爲你已經錯過了那個常規類的定義,所以對象不能看到其他任何人,但它本身。

解決方案是定義該類,或省略new(但我認爲這將是邏輯錯誤)。

3

其他答案在說明問題是什麼時是正確的,但並不真正幫助你理解爲什麼書中的例子顯然不正確。

但是,如果你看一下Artima網站,你會發現the example is in a file here

你的代碼是一個不完整的片段。該文件還包括這些行

// In file ChecksumAccumulator.scala 
class ChecksumAccumulator { 
    private var sum = 0 
    def add(b: Byte) { sum += b } 
    def checksum(): Int = ~(sum & 0xFF) + 1 
} 

...沒有它,你會得到你有錯誤。