【问题标题】:"Lambda with Receiver": What is this Kotlin construct?“带有接收器的 Lambda”:这个 Kotlin 构造是什么?
【发布时间】:2017-10-12 09:02:01
【问题描述】:

我正在查看这个 Kotlin 对象声明:

object A : B({
    variableName1 = "text1"
    variableName2 = "text2"

    params {
        param("Foo", "Bar")
    }
})

而且我无法弄清楚 B 类的构造函数的参数是什么。

在这个例子中我有目的地抽象了信息,但 B 类实际上是

jetbrains.buildServer.configs.kotlin.v10.BuildType

而且我找不到该类型的文档。 I have found something that was close 但它是接口的定义,因此没有构造函数。

总而言之,Kotlin 中的以下构造是什么?

{
    variableName1 = "text1"
    variableName2 = "text2"

    params {
        param("Foo", "Bar")
    }
}

【问题讨论】:

标签: lambda kotlin dsl receiver


【解决方案1】:

这个结构称为"Lambda with Receiver",又名“带有接收器的函数文字”,您会发现它在 Kotlin DSL 实现中广泛使用。例如,查看HTML builder DSL

我在this线程中详细描述了整个概念。

【讨论】:

    【解决方案2】:

    一个尝试用接收器类型解释函数字面量/lambda的例子:

    data class Person(val name: String)
    
    fun getPrefixSafely(
        prefixLength: Int,
        person: Person?,
        getPrefix: Person.(Int) -> String): String
    {
        if (person?.name?.length ?: 0 < prefixLength) return ""
        return person?.getPrefix(prefixLength).orEmpty()
    }
    
    // Here is how getPrefixSafely can be called
    getPrefixSafely(
        prefixLength = 2,
        person = Person("name"),
        getPrefix = { x -> this.name.take(x) }
    )
    

    PS:这些带有接收器类型的 lambda 类似于扩展函数 IMO。

    【讨论】:

      猜你喜欢
      • 2018-02-03
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多