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的接收者绑定规则:
- 先看
let的函数参数定义:block: (T) -> R,这是普通函数类型,不是带接收者的函数类型(带接收者的类型写法是T.() -> R)。普通lambda内部不会定义自己的隐式this,访问this时会直接遵循词法作用域规则,向上查找lambda定义位置所在的外层作用域的this绑定,不会被let函数修改。 - 源码里的
return block(this)这行,这里的this是let作为T的扩展函数自身的接收者(也就是调用let的对象p),它是作为普通位置参数传给block的,所以这个参数在lambda内部就是默认名为it的变量,和lambda内部的this绑定没有任何关系。 - 源码里的
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
相关产品推荐
相关产品推荐

