【笔记】Kotlin作用域函数

Kotlin作用域函数

letrunwithapply 以及 also

对象的上下文中执行代码块。当对一个对象调用这样的函数并提供一个 lambda 表达式时,它会形成一个临时作用域。在此作用域中,可以访问该对象而无需其名称。这些函数称为_作用域函数_。

这五个作用域函数的区别:

  1. 上下文对象是this还是it
  2. 返回值

上下文对象

this

runwith 以及 apply 通过关键字 this 引用上下文对象。

it

let 及 also 将上下文对象作为 lambda 表达式参数。如果没有指定参数名,对象可以用隐式默认名称 it 访问。

返回值

上下文对象

apply 及 also 返回上下文对象。

表达式结果

letrun 及 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
	}  
}

Thanks:

作用域函数

posted @ 2023-06-26 16:40  holdonly  阅读(41)  评论(0)    收藏  举报