В 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
?