|
| 1 | +--- |
| 2 | +layout: multipage-overview |
| 3 | +title: Контекстные абстракции |
| 4 | +scala3: true |
| 5 | +partof: scala3-book |
| 6 | +overview-name: "Scala 3 — Book" |
| 7 | +type: chapter |
| 8 | +description: В этой главе представлено введение в концепцию контекстных абстракций Scala 3. |
| 9 | +language: ru |
| 10 | +num: 59 |
| 11 | +previous-page: types-others |
| 12 | +next-page: ca-extension-methods |
| 13 | +--- |
| 14 | + |
| 15 | +## Предпосылка |
| 16 | + |
| 17 | +Контекстные абстракции — это способ абстрагироваться от контекста. |
| 18 | +Они представляют собой единую парадигму с большим разнообразием вариантов использования, среди которых: |
| 19 | + |
| 20 | +- реализация тайп классов (_type classes_) |
| 21 | +- установление контекста |
| 22 | +- внедрение зависимости (_dependency injection_) |
| 23 | +- выражение возможностей |
| 24 | +- вычисление новых типов и доказательство взаимосвязей между ними |
| 25 | + |
| 26 | +В этом отношении Scala оказала влияние на другие языки. Например, трейты в Rust или protocol extensions Swift. |
| 27 | +Предложения по дизайну также представлены для Kotlin в качестве разрешения зависимостей во время компиляции, |
| 28 | +для C# в качестве Shapes и Extensions или для F# в качестве Traits. |
| 29 | +Контекстные абстракции также являются общей особенностью средств доказательства теорем, таких как Coq или Agda. |
| 30 | + |
| 31 | +Несмотря на то, что в этих проектах используется разная терминология, |
| 32 | +все они являются вариантами основной идеи вывода терминов (term inference): |
| 33 | +учитывая тип, компилятор синтезирует "канонический" термин, который имеет этот тип. |
| 34 | + |
| 35 | +## Редизайн в Scala 3 |
| 36 | + |
| 37 | +В Scala 2 контекстные абстракции поддерживаются пометкой `implicit` определений (методов и значений) или параметров |
| 38 | +(см. [Параметры контекста]({% link _overviews/scala3-book/ca-context-parameters.md %})). |
| 39 | + |
| 40 | +Scala 3 включает в себя переработку контекстных абстракций. |
| 41 | +Хотя эти концепции постепенно "открывались" в Scala 2, теперь они хорошо известны и понятны, и редизайн использует эти знания. |
| 42 | + |
| 43 | +Дизайн Scala 3 фокусируется на **намерении**, а не на **механизме**. |
| 44 | +Вместо того, чтобы предлагать одну очень мощную функцию имплицитов, |
| 45 | +Scala 3 предлагает несколько функций, ориентированных на варианты использования: |
| 46 | + |
| 47 | +- **Расширение классов задним числом**. |
| 48 | + В Scala 2 методы расширения должны были кодироваться с использованием [неявных преобразований][implicit-conversions] или [неявных классов]({% link _overviews/core/implicit-classes.md %}). |
| 49 | + Напротив, в Scala 3 [методы расширения][extension-methods] теперь встроены непосредственно в язык, что приводит к улучшению сообщений об ошибках и улучшению вывода типов. |
| 50 | + |
| 51 | +- **Абстрагирование контекстной информации**. |
| 52 | + [Предложения Using][givens] позволяют программистам абстрагироваться от информации, |
| 53 | + которая доступна в контексте вызова и должна передаваться неявно. |
| 54 | + В качестве улучшения по сравнению со Scala 2 подразумевается, что предложения using могут быть указаны по типу, |
| 55 | + освобождая сигнатуры функций от имен переменных, на которые никогда не ссылаются явно. |
| 56 | + |
| 57 | +- **Предоставление экземпляров тайп-классов**. |
| 58 | + [Given экземпляры][givens] позволяют программистам определять _каноническое значение_ определенного типа. |
| 59 | + Это делает программирование с [тайп-классами][type-classes] более простым без утечек деталей реализации. |
| 60 | + |
| 61 | +- **Неявное преобразование одного типа в другой**. |
| 62 | + Неявное преобразование было [переработано с нуля][implicit-conversions] как экземпляры тайп-класса `Conversion`. |
| 63 | + |
| 64 | +- **Контекстные абстракции высшего порядка**. |
| 65 | + _Совершенно новая_ функция [контекстных функций][contextual-functions] делает контекстные абстракции объектами первого класса. |
| 66 | + Они являются важным инструментом для авторов библиотек и позволяют выражать лаконичный DSL. |
| 67 | + |
| 68 | +- **Полезная обратная связь от компилятора**. |
| 69 | + Если компилятор не может разрешить неявный параметр, теперь он предлагает [предложения по импорту](https://www.scala-lang.org/blog/2020/05/05/scala-3-import-suggestions.html), которые могут решить проблему. |
| 70 | + |
| 71 | +## Преимущества |
| 72 | + |
| 73 | +Эти изменения в Scala 3 обеспечивают лучшее разделение вывода терминов от остального языка: |
| 74 | + |
| 75 | +- существует единственный способ определить данные |
| 76 | +- существует единственный способ ввести неявные параметры и аргументы |
| 77 | +- существует отдельный способ [импорта givens][given-imports], который не позволяет им прятаться в море обычного импорта |
| 78 | +- существует единственный способ определить [неявное преобразование][implicit-conversions], которое четко обозначено как таковое и не требует специального синтаксиса |
| 79 | + |
| 80 | +К преимуществам этих изменений относятся: |
| 81 | + |
| 82 | +- новый дизайн позволяет избежать взаимодействия функций и делает язык более согласованным |
| 83 | +- implicits становятся более легкими для изучения и более сложными для злоупотреблений |
| 84 | +- значительно улучшается ясность 95% программ Scala, использующих implicits |
| 85 | +- есть потенциал, чтобы сделать вывод термов однозначным способом, который также доступен и удобен. |
| 86 | + |
| 87 | +В этой главе в следующих разделах представлены многие из этих новых функций. |
| 88 | + |
| 89 | +[givens]: {% link _overviews/scala3-book/ca-context-parameters.md %} |
| 90 | +[given-imports]: {% link _overviews/scala3-book/ca-given-imports.md %} |
| 91 | +[implicit-conversions]: {% link _overviews/scala3-book/ca-implicit-conversions.md %} |
| 92 | +[extension-methods]: {% link _overviews/scala3-book/ca-extension-methods.md %} |
| 93 | +[context-bounds]: {% link _overviews/scala3-book/ca-context-bounds.md %} |
| 94 | +[type-classes]: {% link _overviews/scala3-book/ca-type-classes.md %} |
| 95 | +[equality]: {% link _overviews/scala3-book/ca-multiversal-equality.md %} |
| 96 | +[contextual-functions]: {{ site.scala3ref }}/contextual/context-functions.html |
0 commit comments