Пакеты и Импорт
Scala использует пакеты для указания пространства имен, они позволяют создавать модульную структуру кода.
Создание пакета
Пакеты создаются путем объявления одного или нескольких имен пакетов в верхней части файла Scala.
package users
class User
По соглашению пакеты называют тем же именем, что и каталог, содержащий файл Scala. Однако Scala не обращает внимания на расположение файлов. Структура каталогов sbt-проекта для package users
может выглядеть следующим образом:
- ExampleProject
- build.sbt
- project
- src
- main
- scala
- users
User.scala
UserProfile.scala
UserPreferences.scala
- test
Обратите внимание, что каталог users
находится внутри каталога scala
и как в пакете содержатся несколько файлов Scala.
Каждый файл Scala в пакете может иметь одно и то же объявление пакета.
Другой способ объявления пакетов - вложить их друг в друга::
package users {
package administrators {
class NormalUser
}
package normalusers {
class NormalUser
}
}
package users:
package administrators:
class NormalUser
package normalusers:
class NormalUser
Как видите, такой способ позволяет вкладывать пакеты друг в друга, а также обеспечивает отличный контроль за областью видимости и возможностью изоляции.
Имя пакета должно быть все в нижнем регистре, и если код разрабатывается в организации имеющей сайт, то следует использовать имя следующего формата: <домен-верхнего-уровня>.<доменное-имя>.<название-проекта>
. Например, если бы у Google был проект под названием SelfDrivingCar
, название пакета выглядело бы следующим образом:
package com.google.selfdrivingcar.camera
class Lens
Что может соответствовать следующей структуре каталога: SelfDrivingCar/src/main/scala/com/google/selfdrivingcar/camera/Lens.scala
.
Импорт
Указание import
открывает доступ к членам (классам, трейтам, функциям и т.д.) в других пакетах. Указание import
не требуется для доступа к членам одного и того же пакета. Указание import
избирательны:
import users._ // групповой импорт всего пакета users
import users.User // импортировать только User
import users.{User, UserPreferences} // импортировать только User, UserPreferences
import users.{UserPreferences => UPrefs} // импортировать и переименовать
import users.* // групповой импорт всего пакета users, кроме given
import users.given // импорт всех given пакета users
import users.User // импортировать только User
import users.{User, UserPreferences} // импортировать только User, UserPreferences
import users.UserPreferences as UPrefs // импортировать и переименовать
Одним из отличий Scala от Java является то, что импорт можно использовать где угодно:
def sqrtplus1(x: Int) = {
import scala.math.sqrt
sqrt(x) + 1.0
}
def sqrtplus1(x: Int) =
import scala.math.sqrt
sqrt(x) + 1.0
В случае возникновения конфликта имен и необходимости импортировать что-либо из корня проекта, имя пакета должно начинаться с префикса _root_
:
package accounts
import _root_.users._
package accounts
import _root_.users.*
Примечание: Пакеты scala
и java.lang
, а также object Predef
импортируются по умолчанию.
Contributors to this page:
Contents
- Введение
- Основы
- Единобразие типов
- Классы
- Значения Параметров По умолчанию
- Именованные Аргументы
- Трейты
- Кортежи
- Композиция классов с трейтами
- Функции Высшего Порядка
- Вложенные Методы
- Множественные списки параметров (Каррирование)
- Классы Образцы
- Сопоставление с примером
- Объекты Одиночки
- Регулярные Выражения
- Объект Экстрактор
- Сложные for-выражения
- Обобщенные Классы
- Вариантность
- Верхнее Ограничение Типа
- Нижнее Ограничение Типа
- Внутренние классы
- Члены Абстрактного Типа
- Составные Типы
- Самоописываемые типы
- Контекстные параметры, также известные, как неявные параметры
- Неявные Преобразования
- Полиморфные методы
- Выведение Типа
- Операторы
- Вызов по имени
- Аннотации
- Пакеты и Импорт
- Объекты Пакета