You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中传入let函数的lambda内this关键字指向什么?

关于let函数代码块内this指向的准确结论

你的猜测不成立,let代码块内的this不会指向调用let的对象,和it的指向完全无关。

直接对应你的示例代码的结果

你给出的代码:

val p: Person = Person() // 注:你原代码里的Preson是拼写笔误
p.let{ this }
  • 如果这段代码写在顶层文件(没有被任何类、对象包裹),代码会直接报编译错误:顶层作用域不存在绑定的this引用。
  • 如果这段代码写在某个类/对象的作用域内部(比如类A的成员函数里),这里的this指向的是当前类A的实例,和p没有任何关联。

底层逻辑说明

结合你贴出的let源码就能完全搞懂规则,核心是Kotlin对lambda的接收者绑定规则:

  1. 先看let的函数参数定义:block: (T) -> R,这是普通函数类型,不是带接收者的函数类型(带接收者的类型写法是T.() -> R)。普通lambda内部不会定义自己的隐式this,访问this时会直接遵循词法作用域规则,向上查找lambda定义位置所在的外层作用域的this绑定,不会被let函数修改。
  2. 源码里的return block(this)这行,这里的this是let作为T的扩展函数自身的接收者(也就是调用let的对象p),它是作为普通位置参数传给block的,所以这个参数在lambda内部就是默认名为it的变量,和lambda内部的this绑定没有任何关系。
  3. 源码里的contract块只是给编译器提供回调调用次数的契约信息,不影响任何运行时的指向逻辑。

对比验证

你可以和标准库里的run/apply函数做对比,这两个函数的block参数是带接收者的函数类型T.() -> R,传入lambda时会把lambda内部的隐式this绑定到调用对象上,这时候this才和你预期的一样指向调用者:

class TestScope {
    fun test() {
        val p = Person()
        // let的this指向外层TestScope实例,it指向p
        p.let {
            println(this === this@TestScope) // true
            println(it === p) // true
        }

        // run的this指向p
        p.run {
            println(this === p) // true
        }
    }
}

内容的提问来源于stack exchange,提问作者Eitanos30

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:06:48