Заменить лямду в функции расширения - PullRequest
0 голосов
/ 20 декабря 2018

Это функция расширения:

fun <T, R> Collection<T>.fold(initial: R,  combine: (acc: R, nextElement: T) -> R): R {
    var accumulator: R = initial
    for (element: T in this) {
        accumulator = combine(accumulator, element)
    }
    return accumulator
}

Можно ли заменить второй параметр, который является функцией, отдельной функцией.Например, что-то похожее на это:

fun <T, R> Collection<T>.fold(initial: R, someFun)

fun someFun (acc: R, nextElement: T) -> R): R {
        var accumulator: R = initial
        for (element: T in this) {
            accumulator = combine(accumulator, element)
        }
        return accumulator
}

Ответы [ 2 ]

0 голосов
/ 22 декабря 2018

Я не уверен, почему вам нужно извлечь функцию таким образом.Нужный код, о котором идет речь, не компилируется, и чтобы предложить рабочую альтернативу, необходимо знать ваше реальное намерение.

Например, если вы не хотите писать длинную сигнатуру функции в типе параметра, возможно,поскольку у вас есть много таких функций, принимающих параметры такого типа, и вы боитесь ошибиться в этой сигнатуре, вы можете извлечь объявление функционального типа в псевдоним типа :

typealias Combiner<R, T> = (acc: R, nextElement: T) -> R

, а затем используйте этот псевдоним типа в объявлении функции:

fun <T, R> Collection<T>.fold(initial: R, combine: Combiner<R, T>): R {
    var accumulator: R = initial
    for (element: T in this) {
        accumulator = combine(accumulator, element)
    }
    return accumulator
}
0 голосов
/ 20 декабря 2018

Вы можете использовать две двоеточия для передачи ссылки на функцию:

var collection = listOf<String>()
collection.fold(3, ::someFun)

fun <T, R> someFun(acc: R, nextElement: T): R {
    var accumulator: R = acc
    // ...
    return accumulator
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...