我仍在學習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互操作性的代價。 –