[Kotlin Cookbook] 如何合并,修改scope(作用域)


在使用作用域函数的时候,常常需要子函数不仅拥有父函数的scope(作用域),而且拥有自定义的额外scope
这可以用接口的继承和委托实现来完成

interface Scope1 {
    fun scopeFun1()
}

interface MergedScope :Scope1{
    fun scopeFun2() // 额外
}

fun Scope1.fun1() {
    var t = 0
    object :MergedScope, Scope1 by this { // 委托this实现Scope1
        override fun scopeFun2() { // 额外的fun2
            println("t = $t")
        }
    }.fun2()
}

fun MergedScope.fun2() {
    scopeFun1()
    scopeFun2()
}

在没有作用域函数的时候,可以传参实现相似的功能

fun f1() {
	var t = 0;
	f2({ (x) -> t=x })
}

fun f2(setT :(Int)->Unit) {
	setT(2)
}