Чтобы начать изучение дизайна DSL с использованием функций языка Kotlin, у меня есть приведенная ниже попытка игрушечного DSL для создания групп членов с членами, имеющими имена. Я ищу указатели / подсказки по следующим
- Как мне избежать разделения групп точкой с запятой, если компилятор не дает точки с запятой
Groups.kt: 31: 45: ошибка: неразрешенная ссылка: member val grp = group {member {name ("Bob")} member {name ("Sandy")}}
Могу ли я использовать лямбда для установки
name
вместо вызова функции?Могу ли я избежать необходимости
name
быть изменяемым в классеMEMBER
?
Мой код
fun group(create: GROUP.() -> Unit) = GROUP().apply(create)
class GROUP {
private val members = mutableSetOf<MEMBER>()
fun member(create: MEMBER.() -> Unit) {
val member = MEMBER()
member.create()
members.add(member)
}
override fun toString() = members.toString()
}
class MEMBER() {
var name = ""
set(value) {
field = value
}
fun name(nameToSet: String) {
name = nameToSet
}
override fun toString() = "MEMBER(" + name + ")"
}
fun main(args: Array<String>) {
val grp = group { member { name ("Bob") }; member { name ("Sandy") } }
println(grp)
}
В настоящее время вывод приведенного выше кода
[ЧЛЕН (Боб), ЧЛЕН (Сэнди)]