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"))
    }
}
Другие вопросы по тегам