'not found:type'错误

时间:2012-09-06 20:16:59

标签: scala

我正在阅读'在scala中编程',在我尝试在Eclipse中编译它的示例中的一个示例中,我收到错误:'not found:type ChecksumAccumulator'类型声明如下。下面的代码是否正确?

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.toBye)
      val cs = acc.checksum()
      cache += (s -> cs)
      cs
    }
}

2 个答案:

答案 0 :(得分:1)

来自Programming in Scala

  

此图中的单个对象名为ChecksumAccumulator,   与前一个示例中的类名称相同。当一个单身人士   对象与一个类共享同一个名称,它被称为该类   伴侣对象。您必须定义类及其随播广告   对象在同一个源文件中。该类称为伴侣   单身对象的类。

如果您尝试单独编译此代码,而没有ChecksumAccumulator类,则会出现编译器错误,因为您无法使用new创建单个对象的实例。 这本书很好地解释了伴侣对象和类如何协同工作,而且由于你已经阅读过它,我不打算在这里添加任何进一步的摘要。

答案 1 :(得分:0)

问题在于,书类定义得太早,后来在文件中 ChecksumAccumulator.scala 类定义不存在。对于初学者来说,它足以误导并且会被卡住。这必须是两个文件的完整代码。

ChecksumAccumulator.scala

import scala.collection.mutable.Map
class ChecksumAccumulator {
 private
 var sum = 0
 def add(b: Byte) {
  sum += b
 }
 def checksum(): Int = ~(sum & 0xFF) + 1
}
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
  }
}

Summer.scala

import ChecksumAccumulator.calculate
object Summer {
 def main(args: Array[String]) {
  for (arg < -args)
   println(arg + ": " + calculate(arg))
 }
}

然后你可以使用。

进行编译
scalac ChecksumAccumulator.scala Summer.scala

然后使用

运行示例
scala Summer of love

这将为您提供以下输出:

of: -213
love: -182