【笔记】Kotlin作用域函数
Kotlin作用域函数
let、run、with、apply 以及 also
对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为_作用域函数_。
这五个作用域函数的区别:
- 上下文对象是this还是it
- 返回值
上下文对象
this
run、with 以及 apply 通过关键字 this 引用上下文对象。
it
let 及 also 将上下文对象作为 lambda 表达式参数。如果没有指定参数名,对象可以用隐式默认名称 it 访问。
返回值
上下文对象
apply 及 also 返回上下文对象。
表达式结果
let、run 及 with 返回 lambda 表达式结果.
run和with的区别
run 和 with 做同样的事情,但是调用方式和 let 一样——作为上下文对象的扩展函数.
val numbers = mutableListOf("one", "two", "three")
with(numbers) {
println("'with' is called with argument $this")
println("It contains $size elements")
}
我们建议使用 with 来调用上下文对象上的函数,而不使用 lambda 表达式结果。 在代码中,with 可以理解为“对于这个对象,执行以下操作。”
使用
以下是根据预期目的选择作用域函数的简短指南:
- 对一个非空(non-null)对象执行 lambda 表达式:
let - 将表达式作为变量引入为局部作用域中:
let - 对象配置:
apply - 对象配置并且计算结果:
run - 在需要表达式的地方运行语句:非扩展的
run - 附加效果:
also - 一个对象的一组函数调用:
with
因为调用的方式不同,所以run和with算不上是扩展函数
val result1 = run{
val a = 1
val b = 2
a+b
}
val result2 = with(result2){
val a =3
a + this
}
注意点
let中it不可修改,但是直接对变量本身的改动是成功的
e.g.
fun updateItInLet(){
var a = 1
a.let {
a = 2
println("it此时是:$it") //1
println("a此时是:$a") //2
}
}

浙公网安备 33010602011771号