在 Kotlin 中,带有接收者的函数类型是一种特殊的函数类型,它允许在函数体内访问接收者对象的成员。这种类型的主要用途之一是支持 DSL(领域特定语言)的构建,以提供更具表达性的 API。
下面是一个带有接收者的函数类型的基本语法和用法:
val myLambda: ReceiverType.() -> ReturnType = {
// lambda body
// 在此处可以使用 ReceiverType 的成员
// 返回值类型为 ReturnType
}
// 例如,调用
val result: ReturnType = myLambda(receiverInstance)
在这里:
-
ReceiverType
是接收者类型,指定了 Lambda 表达式可以在哪种类型的对象上调用。 -
ReturnType
是 Lambda 表达式的返回类型。 -
receiverInstance
是接收者对象的实例,通过它可以在 Lambda 表达式中访问接收者类型的成员。
下面是一个更详细的例子:
data class Person(var name: String, var age: Int)
val lambda: Person.() -> Unit = {
println("Name: $name, Age: $age")
age += 1
}
fun main() {
val person = Person("John", 25)
// 在 Lambda 表达式中,可以直接访问 Person 类的成员
person.lambda()
// 输出: Name: John, Age: 25
println("Updated Age: ${person.age}")
// 输出: Updated Age: 26
}
在上述例子中,Person.() -> Unit
定义了一个带有接收者的函数类型,允许在 Lambda 表达式内部访问 Person
类的成员。通过 person.lambda()
调用,Lambda 表达式中的代码可以直接访问 Person
对象的属性和方法。
这种函数类型的语法为构建 DSL 提供了强大的支持,使得在特定领域中创建更具表达性的 API 变得更加容易。
注意,你只需要把他看作为一个特殊的函数类型
典型应用
kotlin 作用域函数 apply ,also,let,run,with就是带有接收者函数类型的典型应用。看懂了此文章,再看相关源码自然通透。apply官方源代码如下:
/**
* Calls the specified function [block] with `this` value as its receiver and returns `this` value.
*
* For detailed usage information see the documentation for [scope functions](https://kotlinlang.org/docs/reference/scope-functions.html#apply).
*/
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}