Почему мой объект не является членом пакета <root>, если он находится в отдельном исходном файле? - PullRequest
18 голосов
/ 22 марта 2012

У меня проблема с доступом к объекту, определенному в корневом пакете. Если у меня весь мой код в одном файле, он работает нормально, но когда я делю его на два файла, я не могу пройти мимо компилятора.

Это прекрасно работает:

Все в одном файле с именем packages.scala:

object Foo
  val name = "Brian"
}

package somepackage {
  object Test extends App {
    println(Foo.name)
  }
}

Свидетель:

$ scalac packages.scala
$ scala -cp . somepackage.Test
Brian

Но если я разделю код на два файла:

packages.scala

object Foo {
  val name = "Brian"
}

packages2.scala

package somepackage {
  object Test extends App {
    println(Foo.name)
  }
}

все это терпит неудачу:

$ scalac packages.scala packages2.scala
packages2.scala:3: error: not found: value Foo

Поэтому я пытаюсь сделать ссылку на Foo абсолют:

...
    println(_root_.Foo.name)
...

Но это тоже не работает:

$ scalac packages.scala packages2.scala
packages2.scala:3: error: object Foo is not a member of package <root>

Если Foo не является членом корневого пакета, где на земле это это?

Ответы [ 2 ]

27 голосов
/ 22 марта 2012

Я думаю, что это соответствующая часть в спецификации:

Предполагается, что определения верхнего уровня вне упаковки вводятся в специальную пустую упаковку. Этот пакет не может быть назван и поэтому не может быть импортирован. Тем не менее, члены пустого пакета видны друг другу без квалификации.

Источник Справочник Scala §9.2 Пакеты .

Но не спрашивайте меня, почему это работает, если у вас есть следующее в packages2.scala:

object Dummy

package somepackage {
  object Test extends App {
    println(Foo.name)
  }
}
20 голосов
/ 22 марта 2012

Foo является членом корневого пакета, но вы не можете ссылаться на него.Это общая вещь для языков JVM (см. Как получить доступ к java-классам в пакете по умолчанию? для Groovy, Каков синтаксис для импорта класса в пакете по умолчанию в Java? ).То же самое для Scala.

Из ответа Java:

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

Из спецификации языка Java:

Ошибка импорта во время компиляции типа из неназванного пакета.

Причина, по которой он работает в одном файле, заключается в том, что все доступно для компилятора одновременно, и компилятор справляется с этим.Я подозреваю, что это разрешает скрипты.

Мораль истории: не используйте пакет по умолчанию, если вы не пишете скрипты.

...