【问题标题】:What is the purpose of trailing lambda syntax (Kotlin)?尾随 lambda 语法(Kotlin)的目的是什么?
【发布时间】:2019-02-01 21:46:44
【问题描述】:

Passing a lambda to the last parameter

在 Kotlin 中,有一个约定,如果 a 的最后一个参数 function 接受一个函数,一个 lambda 表达式,作为 相应的参数可以放在括号外:

val product = items.fold(1) { acc, e -> acc * e }

这个语法的目的是什么?

【问题讨论】:

  • 提示:你看过fold的函数定义或者理解它的作用吗?
  • @cricket_007 我认为这个问题与代码的工作方式无关,而是与语法的动机有关。 vkelman,请查看kotlinlang.org/docs/reference/type-safe-builders.html 的一些 Kotlin 代码,这些代码广泛利用将 lambda 置于括号之外的能力来创建(在我看来)非常好的 dsl。
  • @SpencerPark 虽然,是的,这些块也适用于 DSL,但我不确定这就是问题所在。关于fold() 显式,第二个参数是一个函数(acc: R, nextElement: T) -> R - kotlinlang.org/docs/reference/lambdas.html
  • @cricket_007 该示例是从参考文档中逐字提取的,但问题是“此语法的目的是什么?”。这看起来像是一个关于语言设计的问题,但我们必须让 vkelman 澄清这一点。
  • 好吧,我明确询问了这种(让我感到困惑)语法的目的是什么。我没有问折叠在做什么。我得到的答案 - 它允许使用 DSL。在我看来,通常那些旨在美化语言的语法糖实际上会使代码更难理解。

标签: lambda kotlin fold


【解决方案1】:

这种语法为 Kotlin 提供了强大的 DSL 功能,它使函数看起来像语言结构。例如:

with(car) {
   startUp()
   goToDestination()
}

这里with看起来像是语言构造,其实它是一个简单的函数,接收lambda作为最后一个参数。

这导致了像Kotlin HTML DSL这样优雅的东西

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-12-26
    • 1970-01-01
    相关资源
    最近更新 更多