Строковые шаблоны в Kotlin

Когда на прошлых уроках мы передавали в функцию println() выражение конкатенации строк, то IntelliJ IDEA подчеркивал это как не совсем корректный код с точки зрения философии Kotlin. Вспомним пример из прошлого урока:

fun main() {
    val s = readLine()!!
 
    for (char in s) {
        println(char + "!")
    }    
}

Соединение символа и строки

Переменная char имеет тип Char – символьный. Мы соединяем символ со строкой "!", а не символом '!', потому что символы между собой не поддерживают ни операцию конкатенации, ни сложения. Однако когда мы пытаемся приплюсовать к строке символ или число, то они автоматически преобразовываются к строковому типу. Таким образом, в конечном итоге Kotlin соединяет две строки.

Если позволить IntelliJ IDEA исправить подчеркнутый участок кода, вместо операции соединения мы получим выражение println("$char!"), две строки станут одной.

Строковый шаблон в Kotlin

Только это строка будет не обычной, она содержит в себе переменную. Чтобы компилятор Kotlin понимал, что char – это переменная, а не часть строки, имени предшествует специальный символ – знак доллара $. При выполнении программы идентификатор, который стоит после этого знака, ищется в наборе доступных программе имен. В данном случае вместо переменной подставляется ее значение.

Подобные строки в Kotlin называются string templates, что можно перевести как строковые шаблоны. Другими словами, имеется шаблон строки, а какая конкретно получится строка, зависит от значения переменных.

Тип вставляемой в строковый шаблон переменной не важен. С таким же успехом мы можем вставлять числовой тип данных.

fun main() {
    val a = 10
    val b = 12
 
    println("$a + $b = ${a + b}")
}

Выражение в строковом шаблоне

В примере показана еще одна возможность строковых шаблонов в Kotlin. Если после знака доллара стоят фигурные скобки, то их содержимое понимается не как часть строки, а как выражение на языке Kotlin, в строку вставляется результат выполнения этого выражения. В фигурные скобки мы могли заключать и сами переменные, потому что вызов переменной по имени – это тоже выражение, хоть и простейшее.

println("${a} + ${b} = ${a + b}")

Однако смысла в этом нет. Компилятор Котлина и так понимал, где конец имени переменной. Другое дело, подобная ситуация, когда без скобок не обойтись:

fun main() {
    val act = "Go"
    println("$acting") // ошибка
    println("${act}ing") // вывод: Going
}

Строковые шаблоны часто используются при вызове функций println() и print(). Однако строковый шаблон никак с ними не связан. Это просто строка, которая как и всякая другая строка может быть присвоена переменной.

fun main() {
    val a = 5
    val b = 10
    val plus = "$a + $b = ${a + b}"
    val minus = "$a - $b = ${a - b}"
 
    println(plus)
    println(minus)
}

Строки-шаблоны, присвоенные переменным

Допустимо вставлять в один строковый шаблон другой.

println("$plus and $minus")

Практическая работа:

  1. Выведите на экран знак доллара – $.

  2. Пользователь вводит с клавиатуры строку. Используя строковый шаблон, выведите на экран саму строку и ее длину.

PDF-версия курса с ответами к практическим работам

Приложение для Android "Kotlin. Курс"