Kotlin dsl для Mutablelist добавить - PullRequest
0 голосов
/ 10 июня 2019

вот расширяемая функция, которую я хочу использовать для добавления дополнительных элементов в 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 Ответ

0 голосов
/ 10 июня 2019

Вы определили функцию расширения 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"))
    }
}
...