Kotlin高阶函数之 .() 的使用

下面我一共举了三个例子,其中第一个是使用了.()进行修饰的方式,这种方式是最简单的方式,第二种是反面例子无法编译通过的,第三个例子是不使用.()扩展apply方法。

1、我们来给StringBuilder增加一个myApply函数,正常使用,因为增加了.()所以在myApply代码块中可以使用this关键字:

//给StringBuilder增加一个myApply,入参位空
//StringBuilder.()     意味着在使用myApply的代码块里可以使用this,this代表调用myApply的对象本身
fun StringBuilder.myApply(block: StringBuilder.() ->Unit) : StringBuilder {
    block()
    return this
}

var sb = StringBuilder("123")
sb.myApply {
    this.append("456")
    this.append("654")
    //如果定义myApply的时候不加.()这里是不可以使用this的
}
println(sb)

//结果:123456654

2、如果不增加StringBuilder.()则无法使用this

fun StringBuilder.myApply1(block: () ->Unit) : StringBuilder {
        block()
        return this
    }

    var sb1 = StringBuilder("123")
    sb1.myApply1 {
        append("456")//编译不过,因为block的入参没有使用StringBuilder.修饰
        append("654")
    }
    println(sb)

3、如果不适用String.()修饰,则需要把StringBuilder当做入参传入,然后再把参数返回。


    fun StringBuilder.myApply1(block: (sb:StringBuilder) ->StringBuilder) : StringBuilder {
        block(sb)
        return sb
    }

    var sb1 = StringBuilder("1234444")
    var sss = sb1.myApply1 {sbParam ->
        sbParam.append("456")
        sbParam.append("654666")
        println("myApply1 code block $sbParam")
        sbParam
    }
    println(sss)

猜你喜欢

转载自blog.csdn.net/mldxs/article/details/127133133