Проще, выбросить исключение, если оно не определено в вашем DLS после блока
fun person(block: (Person) -> Unit): Person {
val p = Person()
block(p)
if (p.name == null) {
// throw some exception
}
return p
}
Или если вы хотите применить его во время сборки, просто сделайте так, чтобы оно возвращало что-то бесполезное во внешний блок, если нетопределены, как ноль.
fun person(block: (Person) -> Unit): Person? {
val p = Person()
block(p)
if (p.name == null) {
return null
}
return p
}
Я предполагаю, что вы ушли этот пример , так что, возможно, адрес будет лучшим примером:
fun Person.address(block: Address.() -> Unit) {
// city is required
var tempAddress = Address().apply(block)
if (tempAddress.city == null) {
// throw here
}
}
Но чтоесли мы хотим убедиться, что все определено, но также хотим, чтобы вы делали это в любом порядке и во время компиляции.Просто, есть два типа!
data class Person(var name: String = null,
var age: Int = null,
var address: Address = null)
data class PersonBuilder(var name: String? = null,
var age: Int? = null,
var address: Address? = null)
fun person(block: (PersonBuilder) -> Unit): Person {
val pb = PersonBuilder()
block(p)
val p = Person(pb.name, pb.age, pb.address)
return p
}
Таким образом, вы получаете нестрогий тип для сборки, но он лучше будет нулевым к концу.Это был забавный вопрос, спасибо.