2010-04-13 10 views
46

Я пытаюсь начать работу с Scala и не могу выбраться из стартовых ворот.Scala дает мне «незаконный старт определения»

файл, состоящий из линии

package x 

дает мне

error: illegal start of definition

Независимо от того, что х и независимо от того, где я положил файл (у меня была теория, что я должен был поместить файл в иерархии каталогов, чтобы соответствовать определению пакета, но нет). Я получаю ту же ошибку с примером кода с веб-сайта и с REPL.

ответ

55

Похоже, вы пытаетесь объявить членство package в скрипте Scala (выполняется с помощью команды scala) или в REPL.

Только файлы, определяющие только классы и объекты, которые скомпилированы с помощью scalac, могут быть определены как принадлежащие к пакету.

Когда вы запускаете код в сценарии или сеансе REPL, за кулисами он фактически скомпилирован внутри метода объекта, в рамках которого объявление пакета не будет законным.

+9

Так как же вы запустили бы код из папки «примеров» архива загрузки scala? Большинство из них имеют строку '' примеры пакетов '', и содержимое придерживается правил, которые я считаю. Я могу '' scalac'' их, но запускаю их, например. '' scala -classpath. sort'' дает мне '' java.lang.NoClassDefFoundError'' !? – ThomasH

+1

@ThomasH > scalac ScalaFileWithPackageLine.scala > fully.qualified.name.of.topLevel.ScalaObject – tdmadeeasy

0

Я не получаю эту ошибку. Как вы это компилируете? И, кстати, какой веб-сайт? Что касается REPL, он не принимает пакеты. Пакеты предназначены только для скомпилированного кода.

+2

Скала Ничего себе, это буквально * никогда * мне пришло в голову, что компилятор и интерпретатор может иметь различные имена команд. Я думал о Python и использовал scala вместо scalac. «Какой веб-сайт?» - Я собирался ответить на http://www.scala-lang.org/, но я пошел и проверил: код примера был от (превосходный) http://max-l.github.com/Squeryl/ (qv). Возможно, вы знаете, что начинаете делать эти маленькие дуэты, дух, шумные шумы, которые вам так нравятся. – Malvolio

+0

У меня такая же ошибка: я в этой папке: https://github.com/Sergey80/scala-samples/tree/master/src/main/scala/partial_function. пытается сделать это: scala PartialToReal.scala – ses

+1

Это скорее комментарий, а не ответ. –

20

С Scala 2.11.0-M7 вы можете использовать :paste -raw (исправить для выпуска SI-5299). Эта опция позволяет определить пакеты в REPL:

scala> :paste -raw 
// Entering paste mode (ctrl-D to finish) 

package Foo 

class Bar 

// Exiting paste mode, now interpreting. 


scala> import Foo._ 
import Foo._ 

scala> new Bar 
res1: Foo.Bar = [email protected]