Строковые шаблоны в Kotlin
Когда на прошлых уроках мы передавали в функцию println()
выражение конкатенации строк, то IntelliJ IDEA подчеркивал это как не совсем корректный код с точки зрения философии Kotlin. Вспомним пример из прошлого урока:
fun main() { val s = readln() for (char in s) { println(char + "!") } }
Переменная char имеет тип Char
– символьный. Мы соединяем символ со строкой "!"
, а не символом '!'
, потому что символы между собой не поддерживают ни операцию конкатенации, ни сложения. Однако когда мы пытаемся приплюсовать к строке символ или число, то они автоматически преобразовываются к строковому типу. Таким образом, в конечном итоге Kotlin соединяет две строки.
Если позволить IntelliJ IDEA исправить подчеркнутый участок кода, вместо операции соединения мы получим выражение println("$char!")
, две строки станут одной.
Только это строка будет не обычной, она содержит в себе переменную. Чтобы компилятор Kotlin понимал, что char – это переменная, а не часть строки, имени предшествует специальный символ – знак доллара $
. При выполнении программы идентификатор, который стоит после этого знака, ищется в наборе доступных программе имен. В данном случае вместо переменной подставляется ее значение.
Подобные строки называются 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")
Практическая работа:
-
Выведите на экран знак доллара –
$
. -
Пользователь вводит с клавиатуры строку. Используя строковый шаблон, выведите на экран саму строку и ее длину.
PDF-версия курса с ответами к практическим работам