0Pricing
Scala for Backend Engineering & Functional Programming · Урок

Scala 3 given/using

Современный синтаксис

«Scala 3 given/using» — бесплатный урок Scala for Backend Engineering & Functional Programming на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Scala for Backend Engineering & Functional Programming, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Современные неявные значения в Scala 3

В Scala 3 перегруженное ключевое слово implicit заменено более ясным синтаксисом: given определяет неявное значение, а using объявляет неявный параметр. Назначение такого кода значительно легче понять.

object Main:
  given greeting: String = "Hello"
  def greet(name: String)(using g: String): String = s"$g, $name!"
  def main(args: Array[String]): Unit =
    println(greet("Ann"))

given заменяет implicit val

Там, где в Scala 2 записывали implicit val x: T = ..., в Scala 3 пишут given x: T = .... Это объявляет значение, доступное для разрешения неявных параметров.

object Main:
  given factor: Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))

using заменяет неявные параметры

Конструкция using помечает список параметров как неявный. Компилятор заполняет его подходящим given из области видимости.

object Main:
  given unit: String = "kg"
  def label(n: Int)(using u: String): String = s"$n$u"
  def main(args: Array[String]): Unit =
    println(label(75))

Безымянные given

Имя given можно опустить, если Вы не обращаетесь к нему напрямую. Компилятор всё равно найдёт его по типу.

object Main:
  given Int = 3
  def triple(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(triple(7))

Получение значения с помощью summon

В Scala 3 функция summon[T] заменяет implicitly[T]. Она напрямую получает заданное значение типа T.

object Main:
  given name: String = "Scala 3"
  def main(args: Array[String]): Unit =
    val n = summon[String]
    println(n)

Безымянные параметры using

Если Вам нужно только передать параметр using дальше, его можно оставить без имени в списке параметров: (using Int). Получить его внутри можно с помощью summon.

object Main:
  given Int = 100
  def boosted(x: Int)(using Int): Int = x + summon[Int]
  def main(args: Array[String]): Unit =
    println(boosted(5))

given для классов типов

Наиболее идиоматичное применение given/using — классы типов. Определите признак, предоставьте экземпляр given и потребуйте его с помощью using.

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[Int] with
    def show(a: Int): String = s"Int($a)"

  def display[A](a: A)(using s: Show[A]): String = s.show(a)

  def main(args: Array[String]): Unit =
    println(display(42))

Ограничения контекста по-прежнему работают

Ограничения контекста [A: Show] по-прежнему доступны и разворачиваются в параметр using. В сочетании с summon они позволяют получить доступ к экземпляру.

trait Show[A]:
  def show(a: A): String

object Main:
  given Show[String] with
    def show(a: String): String = s"Str($a)"

  def display[A: Show](a: A): String = summon[Show[A]].show(a)

  def main(args: Array[String]): Unit =
    println(display("hi"))

Явная передача аргументов using

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

object Main:
  given Int = 10
  def scale(x: Int)(using f: Int): Int = x * f
  def main(args: Array[String]): Unit =
    println(scale(5))
    println(scale(5)(using 2))

Импорт given

В Scala 3 есть специальный синтаксис для импорта given: import pkg.given или import pkg.{given Show[Int]}. Благодаря этому импорты неявных значений становятся явными и осознанными.

object Instances:
  given Int = 5

object Main:
  import Instances.given
  def addBase(x: Int)(using b: Int): Int = x + b
  def main(args: Array[String]): Unit =
    println(addBase(10))

Зачем нужен новый синтаксис

В Scala 2 одно ключевое слово implicit обозначало несколько разных понятий. В Scala 3 концепция разделена: given = предоставить, using = потребовать. Код становится понятнее, а ошибки — легче для понимания.

object Main:
  given pi: Double = 3.14159
  def area(r: Double)(using p: Double): Double = p * r * r
  def main(args: Array[String]): Unit =
    println(area(2.0))

Быстрая проверка

Какие ключевые слова в Scala 3 заменяют implicit для предоставления и требования значений?

Итоги

Вы изучили given/using в Scala 3:

  • given предоставляет неявное значение (заменяет implicit val)
  • using объявляет неявный параметр
  • summon[T] заменяет implicitly[T]
  • Объявления given могут быть безымянными и особенно хорошо подходят для классов типов
  • import pkg.given явно импортирует их

Часто задаваемые вопросы

Урок «Scala 3 given/using» бесплатный?

Да — полный текст урока «Scala 3 given/using» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Scala for Backend Engineering & Functional Programming, подпишись на CoddyKit PRO. Курс Scala for Backend Engineering & Functional Programming содержит 4 уроков всего.

Чему я научусь в уроке «Scala 3 given/using»?

Современный синтаксис Ты практикуешь Scala for Backend Engineering & Functional Programming с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Scala for Backend Engineering & Functional Programming?

Предыдущий опыт не требуется. Scala for Backend Engineering & Functional Programming на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Scala 3 given/using»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Scala for Backend Engineering & Functional Programming?

Да. Каждый урок Scala for Backend Engineering & Functional Programming включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Неявные параметры
  2. Scala 3 given/using
  3. Неявные преобразования
  4. Методы-расширения
← Назад к Scala for Backend Engineering & Functional Programming