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

Встраиваемые методы

inline в Scala 3

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

Что такое inline?

Ключевое слово inline в Scala 3 указывает компилятору раскрыть определение в месте вызова во время компиляции. Это отправная точка метапрограммирования до использования полноценных макросов.

Метод inline

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

inline def square(x: Int): Int = x * x

val r = square(5) // compiles to 5 * 5

Параметры inline

Параметр inline заставляет также встроить переданный ему аргумент. Если аргумент является константой, компилятор может преобразовать его в литерал.

inline def power(x: Int, inline n: Int): Int =
  if (n == 0) 1 else x * power(x, n - 1)

Свёртка констант

Если параметры inline являются литералами, ветвления и рекурсия могут быть полностью разрешены во время компиляции, так что в байт-коде останется только итоговое выражение.

inline def power(x: Int, inline n: Int): Int =
  if (n == 0) 1 else x * power(x, n - 1)

val c = power(2, 3) // expands to 2 * 2 * 2 * 1

inline if и inline match

Внутри inline-метода inline if и inline match разрешаются во время компиляции, если проверяемое значение известно статически, что устраняет невыполняемые ветви.

inline def label(inline b: Boolean): String =
  inline if (b) "yes" else "no"

Прозрачный inline

transparent inline позволяет уточнять возвращаемый тип метода в каждом месте вызова — компилятор может вывести более конкретный тип, чем объявленный.

transparent inline def first(inline b: Boolean): Any =
  inline if (b) 1 else "x" // type can be Int or String

compiletime.error

Пакет scala.compiletime предоставляет такие средства, как error, для остановки компиляции с пользовательским сообщением — это полезно при проверке аргументов inline.

import scala.compiletime.error

inline def positive(inline n: Int): Int =
  inline if (n <= 0) error("n must be positive") else n

Значения inline

inline val является настоящей константой времени компиляции. Её можно использовать там, где требуются литералы, например в других вычислениях inline.

inline val MaxRetries = 3

inline def retries: Int = MaxRetries

Производительность и размер кода

Встраивание увеличивает размер кода ради скорости и гарантий времени компиляции. Чрезмерное использование в больших телах раздувает байт-код, поэтому оставляйте его для небольших, часто выполняемых или требующих специализации методов.

Запуск без inline

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

object Main {
  def square(x: Int): Int = x * x
  def main(args: Array[String]): Unit = {
    println(square(5)) // 25
  }
}

Inline — основа

Макросы строятся на методах inline: inline-определение может вызвать макрос для генерации кода. Если сначала освоить inline, разобраться со слоем макросов будет гораздо проще.

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

Что изменяет добавление transparent к методу inline?

Итоги

Вы изучили встраивание в Scala 3:

  • inline def раскрывается в месте вызова
  • параметры inline и свёртка констант
  • inline if / inline match
  • transparent inline, inline val, compiletime.error

Далее: основы макросов.

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

Урок «Встраиваемые методы» бесплатный?

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

Чему я научусь в уроке «Встраиваемые методы»?

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

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

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

Сколько времени занимает урок «Встраиваемые методы»?

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

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

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

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

  1. Встраиваемые методы
  2. Основы макросов
  3. Цитаты и вставки
  4. Практические макросы
← Назад к Scala for Backend Engineering & Functional Programming