我仍在学习Kotlin并试图理解其核心原则。我不明白的是这样的:命名函数vs lambda反映
fun x() : Int { return 10 }
val y :() -> Int = ::x
val z :() -> Int = { 10 }
fun main(args: Array<String>) {
println(::x)
println(y)
println(z)
}
我们得到以下的输出:
fun x(): kotlin.Int
fun x(): kotlin.Int
() -> kotlin.Int
我的问题是为什么输出是不一样的(我认为这些功能应该是可以互换的,当量)?我认为所有功能的类型应该是() -> Int
。为什么我们保留原始名称与功能签名(fun x
),即使它被分配了不同的名称(y
)?是否有任何语言设计原则会要求功能签名有所不同?
还有一个额外的问题 - 为什么我们需要使用运营商::
。没有它就不能编译。但为什么这是语言设计所要求的呢? val y = x
不会工作得很好,而且更简单吗?
是的......我理解你说的话。但是,如果功能是Kotlin中的“头等公民”,为什么我们需要区分功能的功能和程序起源?他们有不同的属性吗?我想不是 - 你可以给他们打电话,你可以分配一些东西,你可以把他们作为参数传递给他人。你也可以对这两种类型命名的函数和lambda表达式做同样的事情。那么为什么分化呢? –
@ V.K。每种语言的每个特征都是一种妥协。匿名函数是对象,它们可以作为参数传递,而在JVM上它们是匿名类。它们是实现函数接口的Any(实际上是'java.lang.Object')的子类,它们有'hashCode','equals','toString'(甚至更多)方法,它们以某种方式影响GC。另一方面,命名函数是JVM上的普通方法。编译为JS时,技术上的差异较小,因为JS中的所有函数都是匿名的。不一致的函数语法是性能和Java互操作性的代价。 –