@kotlin.internal.InlineOnly
public inline fun <T, R> T.run(block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block()
}
@kotlin.internal.InlineOnly
public inline fun <T, R> with(receiver: T, block: T.() -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return receiver.block()
}
@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block()
return this
}
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
block(this)
return this
}
@kotlin.internal.InlineOnly
public inline fun <T, R> T.let(block: (T) -> R): R {
contract {
callsInPlace(block, InvocationKind.EXACTLY_ONCE)
}
return block(this)
}
上面是常用的五个作用域函数 run let with apply also
从定义上我们看出
apply 和 also 返回的是 this ,他们的区别是 also 可以重命名 this
而 with let run 返回的都是运行后的结果,let 和 run 的区别是 let 可以重命名 this
with 容易识别,因为它的用法和其他有明显的区别,所以也不需要重命名
功能 | 对象参考 | 返回值 | 扩展方法 |
---|---|---|---|
let | it | Lambda结果 | 是 |
run | this | Lambda结果 | 是 |
run | - | Lambda结果 | 否:没有上线问对象调用 |
with | this | Lambda结果 | 否:将上下文对象作为参数 |
apply | this | 上下文对象 | 是 |
also | it | 上下文对象 | 是 |
此外还有 takeIf 和 takeUnless , 它们都是返回自己或null
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeIf(predicate: (T) -> Boolean): T? {
contract {
callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
}
return if (predicate(this)) this else null
}
@kotlin.internal.InlineOnly
@SinceKotlin("1.1")
public inline fun <T> T.takeUnless(predicate: (T) -> Boolean): T? {
contract {
callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
}
return if (!predicate(this)) this else null
}