Лямбда с получателем в Kotlin
У обычной лямбды параметры перечисляют в скобках.
У лямбды с получателем контекст задают в типе
слева от точки: объект подставляется как
this, а не как аргумент it.
Запись StringBuilder.() -> Unit означает
блок без аргументов, который выполняется на
экземпляре StringBuilder. Внутри доступны
append, appendLine и другие
методы буфера:
fun logLine(block: StringBuilder.() -> Unit): String {
val buffer = StringBuilder()
buffer.block()
return buffer.toString()
}
Вызов похож на набор команд у объекта. Ключевое слово this
можно опустить и писать только имя метода:
fun main() {
val line = logLine {
append("user=")
append("ann")
appendLine()
append("role=editor")
}
println(line)
}
Тот же тип получателя удобно передавать дальше, когда несколько функций настраивают один буфер по очереди:
fun StringBuilder.prefix(block: StringBuilder.() -> Unit) {
append("[")
block()
append("]")
}
fun main() {
val text = logLine {
prefix {
append("v1")
}
}
println(text)
}
Напишите функцию, которая принимает
StringBuilder.() -> Unit и возвращает
строку из двух частей "start:" и
":end" вокруг текста блока.
В блоке добавьте две строки через
appendLine и выведите итог. Между
строками не должно быть лишних символов, кроме
перевода строки.