为什么可以';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
。如果没有
操作符,该怎么做?