Добавление импорта пакетов по умолчанию - PullRequest
7 голосов
/ 17 февраля 2011

В Java, Scala или вообще любом языке JVM существует набор пакетов, который импортируется по умолчанию. Java, например, автоматически импортирует java.lang, вам не нужно делать это в вашем файле кода Java.

Теперь я не знаю, какой именно компонент позаботится об этом (компилятор? JVM?), Но есть ли способ импортировать дополнительные пакеты или даже классы по умолчанию?

Скажем, у вас есть пакет, определяющий набор служебных функций, которые вы используете в своем проекте (например, scala.math в Scala), было бы здорово, если бы вы могли пропустить импорт для него в каждом классе, связанном с математикой .

Ответы [ 4 ]

12 голосов
/ 17 февраля 2011

Scala, начиная с версии 2.8, содержит объекты пакета , содержимое которого автоматически импортируется в каждый файл пакета. Создайте файл с именем package.scala в каталоге верхнего уровня вашего пакета (например, x/y/z/mypackage) и поместите в него

package x.y.z

package object mypackage {
  ...
}

Затем любое определение в объекте пакета автоматически импортируется (т. Е. Оператор импорта не требуется) в любой файл в пакете x.y.z.mypackage

Вы можете взглянуть на исходные коды Scala - выполните команду find dir -name package.scala - их несколько, причем самый верхний определяет неявный импорт самого пакета scala, который автоматически импортируется в каждый Исходный файл scala.

11 голосов
/ 17 февраля 2011

Джим Балтер упоминает в свой ответ (поднимите его) Scala 2.8 объект пакета .

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

Для этого поместите определения в объект пакета.Каждому пакету разрешено иметь один объект пакета

На самом деле Scala имеет свой собственный объект пакета scala .
См. " Где разместить объекты пакета ",

Таким образом, объект пакета может решить проблему явного импорта для данного пакета, но не для любого пакета.
Его текущие ограничения включают :

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

Мы ожидаем, что в будущем выпуске Scala эти ограничения будут отменены.


Оригинальный ответ:

На стороне Scala вопрос типа " должен ли Scala импортировать scala.collection.JavaConversions._ по умолчанию? "показывает, что вы не можете просто добавить импорт по умолчанию в качестве пользователя Scala.
Это должно поддерживаться языком.

Кстати, вывод был:

ИзМнение эксперта по Scala: давайте сделаем все просто и ограничим имплициты, импортируемые по умолчанию, до абсолютного минимума.
Хейко Зеебергер


Рафаэль комментирует, хотя:

Полагаю, вы могли бы написать свой собственный плагин компилятора для добавления некоторых пакетов?

И, конечно же, в этой статье Scala описано, какдля расширения компилятора Scala .
Но основные поддерживаемые дополнения:

  • Вы можете добавить фазу в компилятор, добавив, таким образом, дополнительные проверки или дополнительные переписывания дерева, которые применяютсяпосле проверки типа.
  • Вы можетесообщить компилятору информацию о проверке типов об аннотации, предназначенной для применения к типам.

Так что даже при переписывании дерева (включая дополнительный импорт) я не уверен, что переписывание произойдетбудет сделано вовремя, чтобы типы и функции (на которые ссылается запрашиваемый неявный импорт) могли быть правильно проанализированы.
Но, возможно, Scala Compiler Corner имеет больше идей на этот счет.

4 голосов
/ 17 февраля 2011

Импорт по умолчанию всех классов из java.lang указан в Спецификации языка Java (7.5.5)

Все другие классы должны быть импортированы с оператором импорта.

1 голос
/ 17 февраля 2011

В Java нет способа сделать это.

...