Scala 3 — Book

Контекстные абстракции

Language

При определенных обстоятельствах вы можете опустить некоторые параметры вызовов методов, которые считаются повторяющимися.

Эти параметры называются параметрами контекста (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: