"Lambda with Receiver":这个 Kotlin 结构是什么?

"Lambda with Receiver": What is this Kotlin construct?

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

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

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

而且我不知道 class B 的构造函数的参数是什么。

我在这个例子中故意抽象掉了信息,但 class B 实际上是

jetbrains.buildServer.configs.kotlin.v10.BuildType

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

总结一下,Kotlin 中的以下结构是什么?

{
    variableName1 = "text1"
    variableName2 = "text2"

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

这个结构叫做"Lambda with Receiver", aka "Function Literal with Receiver", which you'll find used in Kotlin DSL implementations extensively. For an example, have a look at the HTML builder DSL

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

一个尝试用接收者类型解释函数字面量/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。