“带有接收器的 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 构造是啥?的主要内容,如果未能解决你的问题,请参考以下文章