我正在阅读'在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
}
}
答案 0 :(得分:1)
此图中的单个对象名为
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