Kotlin:内在范围 - 这个

Pau*_*hek 3 kotlin

我刚刚使用了Kotlins自动重构器,它基本上让我这样:

coverView.viewTreeObserver.addOnPreDrawListener {
    coverView.viewTreeObserver.removeOnPreDrawListener(this)
    true
}
Run Code Online (Sandbox Code Playgroud)

哪个不起作用.IntelliJ向我展示了this引用外部类但不引用OnPreDrawListener.这是为什么?kotlin文档说这总是指最内在的范围.

aga*_*aga 8

要修复代码,您可以使用object expression而不是在lambda此处:

coverView.viewTreeObserver.addOnPreDrawListener(object : ViewTreeObserver.OnPreDrawListener {
    override fun onPreDraw(): Boolean {
        coverView.viewTreeObserver.removeOnPreDrawListener(this)
        return true
    }
})
Run Code Online (Sandbox Code Playgroud)

this函数表达式中的表达式(以及传递给addOnPreDrawListener方法的lambda 函数表达式)允许您访问lambda的闭包,即在其最外层作用域中声明的变量,而不是lambda本身.