Kotlin中如何通过文件名访问文件级顶层变量?
在Kotlin中访问被函数参数遮蔽的顶层变量
嘿,这个问题我之前也碰到过!当函数参数和文件级顶层变量同名时,直接引用会优先取局部的参数,这时候你需要明确指定要访问的是顶层作用域的变量。
解决方法:使用this@文件名指定作用域
Kotlin允许你通过this@[你的文件名]来引用文件级的顶层作用域,这样就能绕过局部变量的遮蔽。
假设你的文件名叫FileStorage.kt,修改后的代码如下:
private var user: User? = null // 直接定义在文件内部的顶层变量 fun saveMe(user: User?) { saveObject(user, USER_FILE) this@FileStorage.user = user // 明确指定访问当前文件的顶层user变量 }
另一种方式:使用属性引用
你也可以通过Kotlin的属性引用来访问顶层变量,写法是::user.set(user),不过这种方式不如上面的直观,适合一些特殊场景:
fun saveMe(user: User?) { saveObject(user, USER_FILE) ::user.set(user) // 通过属性引用设置顶层变量 }
原理说明
之所以直接写user不行,是因为Kotlin的作用域规则:局部作用域(比如函数参数)的标识符会遮蔽外层作用域(比如文件顶层)的同名标识符。通过this@文件名或者属性引用,你可以明确告诉编译器要访问的是外层作用域的变量。
内容的提问来源于stack exchange,提问作者Debanjan
相关产品推荐
相关产品推荐

