kotlin如何在多层应用函数中引用外部范围

Jac*_*Zhu 10 lambda apply kotlin

例如:

 v1?.apply {
       v2?.apply {
           call(this, target, outerThis);
       }
    }
Run Code Online (Sandbox Code Playgroud)

我的问题是如何引用"outerThis"?谢谢你的帮助.

zsm*_*b13 22

您可以使用标签,然后使用限定this表达式:

v1?.apply outer@ {
    v2?.apply {
        call(this, target, this@outer)
    }
}
Run Code Online (Sandbox Code Playgroud)


gle*_*e8e 8

通常不建议使用嵌套apply调用,这是为了避免您的情况.您当然可以使用标签作为解决方法,但您也可以使用它also作为替代方案:

v1?.also { outer ->
    v2?.apply { 
        call(this, target, outer)
    }
}
Run Code Online (Sandbox Code Playgroud)

这可以防止标签的使用,这通常是不赞成的.但标签没有任何问题.

注意:also是kotlin 1.1中stdlib的新增功能.如果您使用的是旧版本,则可能无法看到它.将kotlin更新为1.1或在模块中的任何位置添加此代码:

inline fun <T> T.also(block: (T) -> Unit) { block(this) }
Run Code Online (Sandbox Code Playgroud)