Android kotlin中let also apply run with的区别
使用测试代码
class ExtendTest {
@Test
fun letDemo() {
val user = UserInfo()
val result = user.let {
it.name = "name1"
it.age = 20
it.show()
80
}
println("result=$result")
// 输出结果
// name=name1 and age=20
// result=80
}
@Test
fun applyDemo() {
val user = UserInfo()
val result = user.apply {
name = "name1"
age = 20
show()
80
}
println("result=$result")
// 输出结果
// name=name1 and age=20
// result=User对象
}
@Test
fun alsoDemo() {
val user = UserInfo()
val result = user.also {
it.name = "name1"
it.age = 20
it.show()
80
}
println("result=$result")
// 输出结果
// name=name1 and age=20
// result=User对象
}
@Test
fun runDemo() {
val user = UserInfo()
val result = user.run {
name = "name1"
age = 20
this.show()
80
}
println("result=$result")
// 输出结果
// name=name1 and age=20
// result=80
}
@Test
fun withDemo() {
val user = UserInfo()
val result = with(user) {
name = "name1"
age = 20
this.show()
80
}
println("result=$result")
// 输出结果
// name=name1 and age=20
// result=80
}
class UserInfo {
var name = ""
var age = 30
fun show() {
println("name=$name and age=$age")
}
}
}
let的源码
@kotlin.internal.InlineOnly
public inline fun <T, R> T.lets(block: (T) -> R): R {
contract {//它将表明 block 这个扩展方法一定会在这里被执行一次
//callsInPlace(lambda: Function<R>, kind: InvocationKind = InvocationKind.UNKNOWN)
//lambda:执行代码块
//kind:上面 block 将会被执行的次数,kind 有四种类型
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
public enum class InvocationKind {
AT_MOST_ONCE,//最多执行一次
AT_LEAST_ONCE,//至少执行一次
EXACTLY_ONCE,//有且只有一次
UNKNOWN//未知 默认值
}
contract关键字
contract(契约)是一种 Kotlin 面向编译器约定的一种规则,它帮助编译器更加智能地识别某些需要特定的代码条件,为代码创建更加友好的上下文关联环境。
参考地址:https://blog.csdn.net/HJXASLZYY/article/details/122676634 感谢大佬

浙公网安备 33010602011771号