0

我正在阅读“在 Scala 中编程”,在其中一个示例中,当我尝试在 Eclipse 中编译它时收到错误消息:“未找到:类型 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
    }
}
4

2 回答 2

1

来自Scala编程

此图中的单例对象名为ChecksumAccumulator,与上例中的类同名。当一个单例对象与一个类同名时,它被称为该类的伴生对象。您必须在同一个源文件中定义类及其伴随对象。该类称为单例对象的伴生类。

如果您尝试在没有ChecksumAccumulator类的情况下单独编译此代码,您将收到编译器错误,因为您无法使用new. 这本书很好地解释了伴生对象和类是如何协同工作的,既然你已经在阅读它,我就不再费心在这里添加任何进一步的总结了。

于 2012-09-06T20:33:26.533 回答
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
于 2018-02-06T17:17:22.543 回答