Kotlin dsl для Mutablelist добавить
Вот расширяемая функция, которую я хочу использовать для добавления дополнительных элементов в mutableList.
fun MutableList<Field>.withFields(block: () -> Field): MutableList<Field> {
this.add(block())
return this
}
вот как я могу использовать функцию
fun dummy(): MutableList<Field> {
return mutableListOf<Field>().withFields {
Field("first")
Field("second")
Field("last")
}
}
только последний элемент добавляется в список и возвращается. Как мне этого добиться?
1 ответ
Вы определили функцию расширения withFields() как функцию, возвращающую один объект Field. Метод вызывает эту функцию, а затем добавляет возвращаемый объект в базовый список.
Затем вы вызываете withFields(), предоставляя лямбда-функцию. Определение возвращаемого значения лямбда-функции - это значение конечного оператора в функции в случае блока с несколькими операторами. Так что ваша лямбда-функция возвращает только Field("last")
, так как это результат последнего оператора в функции. Другие созданные вами объекты Field игнорируются. Вот почему в список целей добавляется только окончательное значение.
Чтобы иметь возможность добавлять несколько элементов одновременно с помощью какой-либо функции, вам нужно определить такую функцию, которая возвращает несколько элементов, которые будут добавлены... как, например, путем возврата итератора или списка.
ОБНОВЛЕНИЕ: Так может быть что-то вроде этого (не пытался запустить это):
fun MutableList<Field>.withFields(block: () -> List<Field>): MutableList<Field> {
for (field in block()) {
this.add(field)
}
return this
}
fun dummy(): MutableList<Field> {
return mutableListOf<Field>().withFields {
listOf( Field("first"),
Field("second"),
Field("last"))
}
}