Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗ktSpBdNs 27 of 299 menu
◀ ▶

Вложенный построитель в 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". Выведите размер списка ячеек.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить