Вложенный построитель в Kotlin
Сложный результат часто собирают вложенными блоками. Внешний построитель задает общий каркас, внутренний - детали фрагмента. У каждого уровня свой класс- получатель и свой набор команд.
Внешний класс хранит накопленные части и открывает внутренний блок через отдельную функцию. Внутренний класс получает ссылку на внешний объект:
class Form(val lines: MutableList<String> = mutableListOf()) {
fun note(text: String) {
lines.add("note:$text")
}
fun field(block: Field.() -> Unit) {
Field().block()
}
inner class Field {
fun label(text: String) {
note("label:$text")
}
fun hint(text: String) {
lines.add("hint:$text")
}
}
}
Пока метки области нет, внутренний блок может обращаться к членам внешнего через захваченную ссылку. Ниже поле добавляют и сразу читают список снаружи:
fun buildForm(block: Form.() -> Unit): List<String> {
val form = Form()
form.block()
return form.lines
}
fun main() {
val rows = buildForm {
field {
label("name")
hint("latin only")
}
}
println(rows)
}
Вложенность можно повторять: внутри field
остаются только команды Field, а на верхнем
уровне доступны функции Form:
fun main() {
val rows = buildForm {
field { label("city") }
field { label("zip") }
}
println(rows.size)
}
Сделайте внешний класс Sheet с функцией
row и внутренний Row с
cell. Каждая ячейка добавляет строку
в общий список листа.
Соберите лист с двумя строками по две ячейки
"a", "b" и "c",
"d". Выведите размер списка ячеек.