在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
函数被声明为接受正好带有两个参数的函数引用或lambda(来自Kotlin stdlib fold
的以下_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
有什么关系?
答案 0 :(得分:0)
Sequelize.DATE
(或更具体地说,public operator fun times(other: Int): Int
)实际上是::times
类型,与Int.(Int) -> Int
相同。这样就可以将(Int, Int) -> Int
和::times
与::operator
一起使用。