Путаница с простым примером упаковки Scala - PullRequest
2 голосов
/ 26 июля 2010

У меня была путаница из-за классов упаковки в Scala и импорта пакетов.Позвольте мне начать с пары простых исходных файлов:

файл: a / A.scala

package a

// Which of these imports should be used? They both seem to work.
//import a.b._
import b._

class A {
   val fieldB = new B
}

файл: a / b / B.scala

package a.b

class B

Использование

Компиляция со скаляром работает без жалоб с любым из перечисленных выше импортов в A.scala

Попытка загрузки этих файлов в REPL работает иначе:

$ scala
Welcome to Scala version 2.8.0.r0-b20100714201327 (Java HotSpot(TM) Server VM, Java 1.6.0_20).
Type in expressions to have them evaluated.
Type :help for more information.

scala> :l a/b/B.scala
Loading a/b/B.scala...
<console>:1: error: illegal start of definition
       package a.b
       ^
defined class B

scala> :l a/A.scala
Loading a/A.scala...
<console>:1: error: illegal start of definition
       package a
       ^
<console>:5: error: not found: value b
       import b._
              ^
defined class A

scala>

Итак, у меня есть несколько вопросов:

  • Как правильно выполнить этот импорт в A.scala выше?

  • Компилятор кажетсячтобы можно было определить, является ли импорт относительно пакета, в котором мы находимся, или если он абсолютный, без _root_.Это то, что я вижу?

  • Правильно ли я делаю это в REPL?Почему он так недоволен просмотром операторов пакета и почему import b._ генерирует ошибку?

Спасибо

PS Я знаю, что структура каталогов не 'должны соответствовать упаковке.Добровольное поступок помогает мне быть менее запутанным.

Ответы [ 2 ]

6 голосов
/ 26 июля 2010

Во-первых, вы не можете определить пакеты в REPL.Причина этого в том, что ваши REPL-операторы фактически обернуты в object s.Вот почему ваша команда: load терпит неудачу.Вам нужно будет скомпилировать ваши исходные файлы и добавить их в путь к классам, если вы хотите использовать пакеты.

При попытке разрешить импортируемый символ компилятор пытается найти его в вашей действительной области видимости, т.е. когда вы пишете

import a._
import b._

, это импортирует все из package a и все изpackage a.b.Если вы находитесь внутри package a, тогда b уже находится в вашей области, и второго импорта достаточно.Компилятор также изначально импортирует scala._, поэтому вы также можете использовать относительный импорт, например import xml._, для импорта scala.xml._.

Кроме того, есть функция, называемая вложенными пакетами, которая позволяет писать B.scala как

package a
package b
class B { /* .... */ }

, в результате чего в этом файле импортируется все, начиная с package a.

Если компилятор не может разрешить импорт в относительный символ, он будет выглядеть в пакете по умолчанию (_root_).

0 голосов
/ 10 апреля 2016

Чтобы загрузить ваш класс из консоли ...

scala> :paste -raw io/hacking/yourpackage/YourClass.scala

Если у вашего класса есть основной, вы можете вызвать его с помощью:

scala> io.hacking.yourpackage/YourClass.main(Array())

...