“带有接收器的 Lambda”:这个 Kotlin 构造是啥?

Posted

技术标签:

【中文标题】“带有接收器的 Lambda”:这个 Kotlin 构造是啥?【英文标题】:"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")
    

【问题讨论】:

confluence.jetbrains.com/display/TCD10/Kotlin+DSL @YoavSternberg 这就是我所看到的并感到困惑。我可能刚刚错过了说参数是带有接收器的函数文字的短语。 【参考方案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。

【讨论】:

以上是关于“带有接收器的 Lambda”:这个 Kotlin 构造是啥?的主要内容,如果未能解决你的问题,请参考以下文章

kotlin小悟-这个继承有点不一样

kotlin小悟-这个继承有点不一样

是否可以测试这个 Kotlin 类?

kotlin能取代java吗的最新相关信息

如何在 kotlin 中转换这个复杂的 json

了解Kotlin,看这个就够了