【问题标题】:Cannot compile file in Scala无法在 Scala 中编译文件
【发布时间】:2012-01-30 10:17:23
【问题描述】:

从《Begining in 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,然后生成错误,“未找到:type ChecksumAccumulator val acc = new ChecksumAccumulator”,有什么建议吗?

谢谢,

【问题讨论】:

    标签: scala


    【解决方案1】:

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

    检查这个Difference between object and class in Scala

    【讨论】:

      【解决方案2】:

      你可能遗漏了一些看起来像

      的代码

      类 ChecksumAccumulator { //... }

      【讨论】:

        【解决方案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
        }
        

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

        【讨论】:

          【解决方案4】:

          你的问题在这里

           val acc = new ChecksumAccumulator
          

          您不能对对象使用 new 关键字。 对象不能被重新实例化。在 scala 中你总是有一个对象的单个实例。这类似于java中的静态成员。

          【讨论】:

            【解决方案5】:

            您的代码,可能意味着companion 对象。这有点像命令式语言中的factories

            基本上,您有 objectclass 对。对象(命令式语言中的singleton)不能被多次实例化,正如这里的人们已经指出的那样,通常用于定义一些静态逻辑。事实上,只有一个实例化——当你第一次调用他时。但是 object 可以有 compaion -- 常规类,而且,我认为您已经错过了该常规类的定义,所以 object 不能看到其他任何人,只能看到它自己。

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2018-06-02
              • 2021-04-02
              • 1970-01-01
              相关资源
              最近更新 更多