无法在Scala中编译文件

时间:2011-12-30 07:43:03

标签: scala

从“在Scala中开始”一书中的示例,脚本是:

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”,有什么建议?

谢谢,

5 个答案:

答案 0 :(得分:7)

'object'关键字定义单个对象,而不是类。所以你不能新建一个对象,'new'关键字需要一个类。

检查此Difference between object and class in Scala

答案 1 :(得分:3)

你可能留下了一些看起来像

的代码

class ChecksumAccumulator { // ... }

答案 2 :(得分: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
}

......没有它你就会得到你的错误。

答案 3 :(得分:2)

你的问题在这里

 val acc = new ChecksumAccumulator

您不能在对象中使用new关键字。 对象无法重新实例化。您始终在scala中拥有对象的单个实例。这类似于java中的静态成员。

答案 4 :(得分:0)

您的代码,可能是companion个对象。在命令式语言中有点factories

基本上,您有对象对。对象(命令式语言中的 singleton )无法多次实例化,正如此处已经注意到的那样,并且通常用于定义一些静态逻辑。事实上,只有一个实例 - 当你第一次给他打电话时。但是对象可以有 compaion - 常规类,并且,因为我认为你错过了常规类的定义,所以对象不能看到任何其他人,而是本身。

解决方案是定义该类,或省略new(但我认为这是逻辑错误的。)