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 — локальная установка не требуется.
Все уроки этого курса
- Неявные параметры
- Scala 3 given/using
- Неявные преобразования
- Методы-расширения