"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。
我正在查看这个 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。