kotlin 踩坑实录(一)之apply

来源:互联网 发布:淘宝推广员工资待遇 编辑:程序博客网 时间:2024/06/06 08:24

kotlin中的apply方法的作用是传入lambda表达式,并将lambda表达式中对apply调用对象进行修改,然后将修改后的对象进行返回。

今天尝试使用过程中,由于将“()”错写成“{}”,导致调用apply之后,对象的状态并没有发生改变,代码如下:

val action: StringBuilder.() -> Unit = { append("aa") }
println(StringBuilder().apply { action })  //action被大括号包裹
println(StringBuilder().apply(action)) //action被小括号包裹
我们会调用后会发现结果,第一句打印内容为空,第二句打印的结果为“aa”

如果一定要使用大括号{}的话需要把第一句改为

println(StringBuilder().apply { action() }) //在action后面加入小括号
改成这样后就也可以正常打印“aa”了。
当然在以上的例子中最合理的写法应该是下面这样:
 val action: StringBuilder.() -> StringBuilder = { append("aa") } // print(StringBuilder().action())

由于lambdab表达式定义了接收者,相当于在action的作用域内定义了该类的扩展函数一样,直接使用StringBuilder对象调用该函数即可。
在lambda表达式中,是不能写return的,如果说,我们需要action类型为StringBuilder.() -> Int该怎么办?
lambda表达是的最后一行会自动判断类型是否匹配于Int,所以最简单的改法(可能没有什么意义,只是为了展示语法)如下:
val action: StringBuilder.() -> Int = {    append("aa")    1            //把1写在最后一行,当然任何返回值为Int的函数调用来替换都是合法的}


原创粉丝点击