“Lambda with Receiver”:这个Kotlin构造是什么?

时间:2017-10-12 09:02:01

标签: lambda kotlin dsl receiver

我正在看这个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")
    }
}

2 个答案:

答案 0 :(得分:9)

此构造称为"Lambda with Receiver",又名“带接收器的函数文字”,您可以在Kotlin DSL实现中广泛使用它。例如,请查看HTML builder DSL

我在this主题中详细描述了整个概念。

答案 1 :(得分:0)

尝试用接收器类型解释函数字面量/ 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 的扩展函数。