Смущает параметры функций высшего порядка в Котлине - PullRequest
0 голосов
/ 23 октября 2018

В Kotlin я пишу следующий код, который вызывает функцию fold.

fun operation(acc: Int, next: Int): Int {
    return acc * next
}
val items = listOf(1, 2, 3, 4, 5)
println(items.fold(1, ::operation))

В 5-й строке приведенного выше кода функция fold использует функцию operation.

Это разумно, поскольку объявляется, что функция fold принимает ссылку на функцию или лямбду, которая принимает ровно ДВА параметра (3-я строка следующей реализации fold из stdlib Kotlin _Collections.kt)

public inline fun <T, R> Iterable<T>.fold(
        initial: R, 
        operation: (acc: R, T) -> R
): R {
    var accumulator = initial
    for (element in this) accumulator = operation(accumulator, element)
    return accumulator
}

Что меня смущает, так это то, что функция fold может также снабжаться однопараметрической функцией Int::times, как показано ниже.

val items = listOf(1, 2, 3, 4, 5)
println(items.fold(1, Int::times))

AFAIK, Int::times объявлен какоднопараметрическая функция-член, как показано ниже:

/** Multiplies this value by the other value. */
public operator fun times(other: Int): Int

Я не совсем понимаю противоречие.Это как-то связано с ключевым словом operator?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...