簡體   English   中英

為什么 Kotlin 對 lambdas / 匿名函數有兩種語法?

[英]Why does Kotlin have two syntaxes for lambdas / anonymous functions?

Kotlin 有兩種聲明匿名函數(又名 lambda)的方法。 兩種不同的語法是:

val lambda =  { input : String -> 
  "received ${input}"
}

val anonymousFunction =  fun (input : String): String {
  return "received ${input}"
}

我了解兩者之間的區別(如本答案所述),但我不明白的是為什么該語言有兩種不同的聲明方式。

引擎蓋下是否有優化工作? 是不是覺得匿名函數版本太啰嗦了? 語法的 lambda 版本是否不支持返回類型?

關鍵原因是對 lambda 返回的支持。 返回的規則是return關鍵字從最近的用fun關鍵字聲明的函數返回。 在某些情況下,你想return的代碼塊從封閉函數返回時,讓你使用lambda:

fun processElements(list: List<Element>): Boolean {
     list.forEach { element ->
          if (!element.process()) return false   // returns from processElements()
     }
     return true
}

在其他情況下,您希望從塊返回而不是從封閉函數返回。 使用 lambda 時,從塊return@label需要return@label語法,這有點笨拙:

fun processElements(list: List<Element>) {
     list.forEach { element ->
          if (!needToProcessElement(element)) return@forEach // returns from block
          element.process()
     }
}

為了避免clunkiness,我們提供了一個替代語法-匿名功能-它允許你使用return直接從座返回:

fun processElements(list: List<Element>) {
    list.forEach(fun(element) { 
        if (!needToProcessElement(element)) return // returns from block
        element.process()
    })
}

第二個原因是,確實不可能將返回類型聲明放入 lambda 的語法中,但這在實踐中很少需要,因此並不是特別重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM