为什么可以';t函数是否可以直接用作Kotlin中的lambda?
在科特林,我们不能写:为什么可以';t函数是否可以直接用作Kotlin中的lambda?,kotlin,Kotlin,在科特林,我们不能写: arrayOf(1,2,3).forEach(println) 但是我们必须使用:println调用forEach。这是因为forEach需要lambda,但println是一个函数。为什么这些类型不同?Kotlin没有像在Python中那样为我自动转换它,有什么好的理由吗 更新: 看起来确实有区别。看看: val addA: (Int)->Int = {it+1} fun addB(i: Int) = i+1 fun main(args: Array<S
arrayOf(1,2,3).forEach(println)
但是我们必须使用:println
调用forEach
。这是因为forEach
需要lambda,但println
是一个函数。为什么这些类型不同?Kotlin没有像在Python中那样为我自动转换它,有什么好的理由吗
更新:
看起来确实有区别。看看:
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)
}
valadda:(Int)->Int={it+1}
乐趣添加b(i:Int)=i+1
趣味主线(args:Array){
变量x:Int=0
x、 let(addA).let(::addB).let(::打印)
}
lambda不需要
:
,但是函数需要我不认为lambda和函数是不同的类型。唯一存在的类型是函数类型
,lambda是实例化函数的一种方法。文档中提供了将实例转换为函数类型的所有方法
::println
是获取对现有声明的引用的一种方法。因此,您的问题是为什么需要使用:
。也许这只是为了在其他情况下获得一个函数引用的一致方法,就像您希望引用一个特定实例的成员,如foo::toString
我不认为lambda和函数是不同的类型。唯一存在的类型是函数类型
,lambda是实例化函数的一种方法。文档中提供了将实例转换为函数类型的所有方法
::println
是获取对现有声明的引用的一种方法。因此,您的问题是为什么需要使用:
。也许这只是为了在其他情况下以一致的方式获取函数引用,比如当您希望引用指向特定实例的成员时,foo::toString
当然可以,但在Python中它是foo::toString而不是foo.toString的原因是什么?动机是什么?它是一个用于显式获取成员或类引用的运算符。它也可以用于反射目的。看一看。我知道kotlin的创建者喜欢显式,所以可能这就是为那些用例创建特定操作符的原因,但我现在只是推测一下。您可以在这里看到::x
返回KProperty
。如果没有::
操作符,该怎么做?当然可以,但在Python中它是foo::toString而不是foo.toString的原因是什么?动机是什么?它是一个用于显式获取成员或类引用的运算符。它也可以用于反射目的。看一看。我知道kotlin的创建者喜欢显式,所以可能这就是为那些用例创建特定操作符的原因,但我现在只是推测一下。您可以在这里看到::x
返回KProperty
。如果没有:
操作符,该怎么做?