В Scala 3 все виды определений могут быть записаны на “верхнем уровне” ваших файлов с исходным кодом. Например, вы можете создать файл с именем MyCoolApp.scala и поместить в него следующее содержимое:
import scala.collection.mutable.ArrayBuffer
enum Topping:
case Cheese, Pepperoni, Mushrooms
import Topping.*
class Pizza:
val toppings = ArrayBuffer[Topping]()
val p = Pizza()
extension (s: String)
def capitalizeAllWords = s.split(" ").map(_.capitalize).mkString(" ")
val hwUpper = "hello, world".capitalizeAllWords
type Money = BigDecimal
// по желанию здесь можно указать ещё больше определений ...
@main def myApp =
p.toppings += Cheese
println("show me the code".capitalizeAllWords)
Как показано, нет необходимости помещать эти определения внутрь конструкции package
, class
или иной конструкции.
Заменяет объекты пакета
Если вы знакомы со Scala 2, этот подход заменяет объекты пакета (package objects).
Но, будучи намного проще в использовании, они работают одинаково:
когда вы помещаете определение в пакет с именем foo
,
вы можете получить доступ к этому определению во всех других пакетах в foo
, например, в пакете foo.bar
,
как в этом примере:
package foo {
def double(i: Int) = i * 2
}
package foo {
package bar {
@main def fooBarMain =
println(s"${double(1)}") // это работает
}
}
Фигурные скобки используются в этом примере, чтобы подчеркнуть вложенность пакета.
Преимуществом такого подхода является то, что можно размещать определения в пакете с именем com.acme.myapp
,
а затем можно ссылаться на эти определения в com.acme.myapp.model
, com.acme.myapp.controller
и т.д.
Contributors to this page:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java