Не удается скомпилировать файл в Scala - PullRequest
4 голосов
/ 30 декабря 2011

Из примера в книге «Начало в 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 ", есть предложения?

Спасибо,

Ответы [ 5 ]

7 голосов
/ 30 декабря 2011

Ключевое слово 'object' определяет одноэлементный объект, а не класс.Поэтому вы не можете создать новый объект, для ключевого слова 'new' требуется класс.

отметьте Разница между объектом и классом в Scala

3 голосов
/ 30 декабря 2011

Другие ответы верны, когда говорят о том, в чем проблема, но не помогают понять, почему пример из книги, по-видимому, неверен.

Однако, если вы посмотрите на сайт Artima, вы увидитенайти пример находится в файле здесь

Ваш код является неполным фрагментом.Файл также содержит эти строки

// In file ChecksumAccumulator.scala
class ChecksumAccumulator {
  private var sum = 0
  def add(b: Byte) { sum += b }
  def checksum(): Int = ~(sum & 0xFF) + 1
}

... без которых вы получите сообщение об ошибке.

3 голосов
/ 30 декабря 2011

Вы, вероятно, пропустили некоторый код, который выглядит как

класс ChecksumAccumulator { // ... }

2 голосов
/ 30 декабря 2011

ваша проблема здесь

 val acc = new ChecksumAccumulator

вы не можете использовать новое ключевое слово с объектом. объекты не могут быть восстановлены. У вас всегда есть один экземпляр объекта в Scala. Это похоже на статические члены в Java.

0 голосов
/ 30 декабря 2011

Ваш код, вероятно, подразумевается как сопутствующий объект.Это вроде фабрики на императивных языках.

По сути, у вас есть объект и класс пара.Объект ( singleton в императивных языках) не может быть создан несколько раз, как уже отмечали люди, и обычно используется для определения некоторой статической логики.На самом деле, есть только один экземпляр - когда вы звоните ему в первый раз.Но объект может иметь compaion - обычный класс, и, как я думаю, вы пропустили определение этого обычного класса, поэтому объект не может видеть никого другого, кроме самого себя.

решение состоит в том, чтобы определить этот класс или опустить new (но я думаю, что это было бы логично неправильно).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...