Kotlin标准函数run,with,let,also和apply的使用和区别##
和Java相比,在Kotlin中提供了不少新的特性。这次我们就来聊一聊Kotlin的一些通用的扩展标准函数run,with,let,also和apply。对于这五个标准函数它们都存在于Kotlin的源码标准库当中,也就是在Standard.kt文件当中。它们都是适用于任何对象的通用扩展函数。但是对于run,with,let,also和apply这五个函数他们的用法及其相似,以至于我们无法确定去选择使用哪一个。那么现在我们就来聊一下这五个函数它们的使用方法,它们的不同之处以及在什么场景下去使用。
作用域函数##
在这里我们重点是看一下run,with,T.run,T.let,T.also,和T.apply,对于这几个函数来说它们最重要的功能之一是在调用函数的内部又提供了一个作用域。
那么下面就通过一段代码来看一下run函数的作用域,对于其它函数来说当然也是类似。
fun test(){
var animal = "cat"
run {
val animal = "dog"
println(animal) // dog
}
println(animal) //cat
}
在这个简单的test函数当中我们拥有一个单独的作用域,在run函数中能够重新定义一个animal变量,并且它的作用域只存在于run函数当中。
目前对于这个run函数看起来貌似没有什么用处,但是在run函数当中它不仅仅只是一个作用域,他还有一个返回值。他会返回在这个作用域当中的最后一个对象。
例如现在有这么一个场景,用户领取app的奖励,如果用户没有登录弹出登录dialog,如果已经登录则弹出领取奖励的dialog。我们可以使用以下代码来处理这个逻辑。
run {
if (islogin) loginDialog else getAwardDialog
}.show()
with和其它通用标准函数##
在这里之所以将with函数单独拿出来进行说明,是因为with得用法和其它通用的标准函数的用法比较独特。在这里我们依然使用run函数来进行对比。对于下面这段代码做的是同样一件事。它们的不同之处就是一个使用了with(T)函数,而另一个则是使用了T.run函数。
with(webView.settings){
javaScriptEnabled = true
databaseEnabled = true
}
webView.settings.run {
javaScriptEnabled = true
databaseEnabled = true
}
但是我们觉得使用哪一个会更好呢?现在假设一种场景,那就是webView.settings可能为null。那我们就来再次看一下下面这段代码.
with(webView.settings){
javaScriptEnabled = true
databaseEnabled = true
}
webView.settings?.run {
javaScriptEnabled = true
databaseEnabled = true
}
网友评论