1.Apply(使用this代表当前对象,返回值是当前对象)
* 1.任意对象 任意类型都有apply扩展函数
* 2.apply函数参数是函数类型 带接受者(T)的函数字面值
* 3.apply函数返回值是当前对象本身
源码如下
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
2.Let(使用it代表当前对象,返回值是表达式最后一行)
-
1.let函数给任意类型添加的扩展函数
-
2.let函数参数是函数类型 函数参数就是自己本身
-
3.函数参数返回值是任意类型
-
4.let函数返回值就是block函数的返回值
let和apply最大的区别:函数参数不同(定义位置).apply是定义在对象里面的函数,let为普通函数
源码
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
3.With(使用this代表当前对象,返回值是最后一行)
-
1.with函数是一个独立的函数 可以独立使用
-
2.with函数有两个参数 第一个可以传递任意类型 第二个参数:带接收者的函数字面值 ,接收者是第一个参数
-
3.with函数返回值就是第二个函数参数返回值
-
with相当于是apply和let的结合.
-
with()
源码
public inline fun <T, R> with(receiver: T, block: T.() -> R): R { contract { callsInPlace(block, InvocationKind.EXACTLY_ONCE) } return receiver.block() }
4.Run(代码块)
-
和apply函数类似 区别就是函数的返回值
-
run函数返回值就是block函数的返回值
-
run函数有两个参数 第一个可以传递任意类型 第二个参数:带接收者的函数字面值 ,接收者是第一个参数
源码
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
网友评论