Kotlin 作用域函数

@kotlin.internal.InlineOnly
public inline fun  T.run(block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return block()
}

@kotlin.internal.InlineOnly
public inline fun  with(receiver: T, block: T.() -> R): R {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    return receiver.block()
}

@kotlin.internal.InlineOnly
public inline fun  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.also(block: (T) -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block(this)
    return this
}

@kotlin.internal.InlineOnly
public inline fun  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.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.takeUnless(predicate: (T) -> Boolean): T? {
    contract {
        callsInPlace(predicate, InvocationKind.EXACTLY_ONCE)
    }
    return if (!predicate(this)) this else null
}

你可能感兴趣的:(Kotlin 作用域函数)