В 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