在 Kotlin 中我们不能写:
arrayOf(1,2,3).forEach(println)
但我们必须调用forEach
using ::println
。这是因为forEach
期望一个 lambda,但是println
是一个函数。为什么这些类型是不同的?Kotlin 没有像 Python 那样自动为我转换它,有什么充分的理由吗?
Update:
看来确实有区别。看着:
val addA: (Int)->Int = {it+1}
fun addB(i: Int) = i+1
fun main(args: Array<String>){
var x: Int=0
x.let(addA).let(::addB).let(::print)
}
lambda 不需要::
,但该函数确实
我不认为 lambda 和函数是不同的类型。唯一存在的类型是function type
lambda 是实例化函数的一种方式。文档中列出了获取函数类型实例的所有方法https://kotlinlang.org/docs/reference/lambdas.html#instantiating-a-function-type https://kotlinlang.org/docs/reference/lambdas.html#instantiating-a-function-type.
::println
是获取对现有声明的引用的一种方法。所以你的问题是为什么需要使用::
。也许只是为了在其他情况下以一致的方式获取函数引用,例如当您想要指向特定实例的成员的引用时foo::toString
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)