При определенных обстоятельствах вы можете опустить некоторые параметры вызовов методов, которые считаются повторяющимися.
Эти параметры называются параметрами контекста (Context Parameters), поскольку они выводятся компилятором из контекста, окружающего вызов метода.
Например, рассмотрим программу, которая сортирует список адресов по двум критериям: название города, а затем название улицы.
val addresses: List[Address] = ...
addresses.sortBy(address => (address.city, address.street))
Метод sortBy
принимает функцию, которая возвращает для каждого адреса значение, чтобы сравнить его с другими адресами.
В этом случае мы передаем функцию, которая возвращает пару, содержащую название города и название улицы.
Обратите внимание, что мы только указываем, что сравнивать, но не как выполнять сравнение.
Откуда алгоритм сортировки знает, как сравнивать пары String
?
На самом деле метод sortBy
принимает второй параметр — параметр контекста, который выводится компилятором.
Его нет в приведенном выше примере, поскольку он предоставляется компилятором.
Этот второй параметр реализует способ сравнения.
Его удобно опустить, потому что мы знаем, что String
-и обычно сравниваются в лексикографическом порядке.
Однако также возможно передать параметр явно:
addresses.sortBy(address => (address.city, address.street))(Ordering.Tuple2(Ordering.String, Ordering.String))
addresses.sortBy(address => (address.city, address.street))(using Ordering.Tuple2(Ordering.String, Ordering.String))
в Scala 3 using
в списке аргументов сигнализирует sortBy
о явной передаче параметра контекста, избегая двусмысленности.
В этом случае экземпляр Ordering.Tuple2(Ordering.String, Ordering.String)
— это именно тот экземпляр,
который в противном случае выводится компилятором.
Другими словами, оба примера создают одну и ту же программу.
Контекстные абстракции используются, чтобы избежать повторения кода. Они помогают разработчикам писать фрагменты кода, которые являются расширяемыми и в то же время лаконичными.
Дополнительные сведения см. в главе “Контекстные абстракции” этой книги, а также в справочной документации.
Contributors to this page:
Contents
- Введение
- Возможности Scala
- Почему Scala 3?
- Почувствуй Scala
- Пример 'Hello, World!'
- REPL
- Переменные и типы данных
- Структуры управления
- Моделирование данных
- Методы
- Функции первого класса
- Одноэлементные объекты
- Коллекции
- Контекстные абстракции
- Верхнеуровневые определения
- Обзор
- Первый взгляд на типы
- Интерполяция строк
- Структуры управления
- Моделирование предметной области
- Инструменты
- Моделирование ООП
- Моделирование ФП
- Методы
- Особенности методов
- Main методы в Scala 3
- Обзор
- Функции
- Анонимные функции
- Параметры функции
- Eta расширение
- Функции высшего порядка
- Собственный map
- Создание метода, возвращающего функцию
- Обзор
- Пакеты и импорт
- Коллекции в Scala
- Типы коллекций
- Методы в коллекциях
- Обзор
- Функциональное программирование
- Что такое функциональное программирование?
- Неизменяемые значения
- Чистые функции
- Функции — это значения
- Функциональная обработка ошибок
- Обзор
- Типы и система типов
- Определение типов
- Параметризованные типы
- Пересечение типов
- Объединение типов
- Алгебраические типы данных
- Вариантность
- Непрозрачные типы
- Структурные типы
- Зависимые типы функций
- Другие типы
- Контекстные абстракции
- Методы расширения
- Параметры контекста
- Контекстные границы
- Given импорты
- Классы типов
- Многостороннее равенство
- Неявное преобразование типов
- Обзор
- Параллелизм
- Scala утилиты
- Сборка и тестирование проектов Scala с помощью Sbt
- Рабочие листы
- Взаимодействие с Java