Встраиваемые методы
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 * 1inline 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 Stringcompiletime.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 matchtransparent 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 — локальная установка не требуется.
Все уроки этого курса
- Встраиваемые методы
- Основы макросов
- Цитаты и вставки
- Практические макросы