kotlin带有接收者的函数类型

在 Kotlin 中,带有接收者的函数类型是一种特殊的函数类型,它允许在函数体内访问接收者对象的成员。这种类型的主要用途之一是支持 DSL(领域特定语言)的构建,以提供更具表达性的 API。

下面是一个带有接收者的函数类型的基本语法和用法:

kotlin 复制代码
val myLambda: ReceiverType.() -> ReturnType = {
    // lambda body
    // 在此处可以使用 ReceiverType 的成员
    // 返回值类型为 ReturnType
}

// 例如,调用
val result: ReturnType = myLambda(receiverInstance)

在这里:

  • ReceiverType 是接收者类型,指定了 Lambda 表达式可以在哪种类型的对象上调用。
  • ReturnType 是 Lambda 表达式的返回类型。
  • receiverInstance 是接收者对象的实例,通过它可以在 Lambda 表达式中访问接收者类型的成员。

下面是一个更详细的例子:

kotlin 复制代码
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官方源代码如下:

kotlin 复制代码
/**  
* 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  
}
相关推荐
jinanwuhuaguo8 小时前
(第二十七篇)OpenClaw四月的演化风暴:OpenClaw 2026年4月全版本更新的文明级解读
大数据·人工智能·架构·kotlin·openclaw
我命由我123458 小时前
Kotlin 开发 - lateinit 关键字
android·java·开发语言·kotlin·android studio·android-studio·android runtime
小书房13 小时前
Kotlin的by
android·开发语言·kotlin·委托·by
jinanwuhuaguo13 小时前
(第二十八篇)OpenClaw成本与感知的奇点——从“Token封建制”到“全民养虾”的本体论地基
android·人工智能·kotlin·拓扑学·openclaw
jinanwuhuaguo1 天前
OpenClaw联邦之心——从孤岛记忆到硅基集体潜意识的拓扑学革命(第二十三篇)
android·人工智能·kotlin·拓扑学·openclaw
pengyu2 天前
【Kotlin 协程修仙录 · 筑基境 · 后阶】 | 调度器的艺术:Dispatchers 四大护法与 withContext 性能密码
android·kotlin
千码君20162 天前
flutter: 分享一下基于trae cn 构建的过程
java·vscode·flutter·kotlin·trae
小书房3 天前
Kotlin的内联函数
java·开发语言·kotlin·inline·内联函数
zhangphil3 天前
Android Page3与Flow分页查媒体数据库展示宫格图片列表,Kotlin
android·kotlin
胡致和3 天前
配置变更后,弹窗为什么飞到了最左边?
kotlin