Kotlin中如何在with作用域内访问外部作用域变量?
Kotlin with块中访问外部局部变量的可行方案
你的问题出在:with(data)代码块的上下文是MyData实例,直接写name会优先指向MyData的name属性;而外部的name是函数内的局部变量,并非类成员,所以this@name这种写法无效(this在这里指代KotlinTest的实例,该实例并没有name属性)。
以下是两种可行的解决方式:
方式一:利用函数名作为作用域标签
函数本身就是一个作用域,可以直接用函数名作为标签来限定访问外部局部变量:
class KotlinTest { @Test fun `scoping head scratcher`() { data class MyData(val name:String) val name = "Happy Wok" val data = MyData(name) with(data) { assert(name == this@`scoping head scratcher`.name) } } }
方式二:自定义作用域标签
给外部变量所在的代码块添加自定义标签,通过标签来指定作用域:
class KotlinTest { @Test fun `scoping head scratcher`() { data class MyData(val name:String) outerScope@ { val name = "Happy Wok" val data = MyData(name) with(data) { assert(name == this@outerScope.name) } }() } }
核心逻辑是:局部变量的作用域需要通过作用域标签来明确指定,而不是依赖this(this仅适用于类、对象或扩展函数的上下文)。
内容的提问来源于stack exchange,提问作者Kurt
相关产品推荐
相关产品推荐

