cyrushine / bookmark

4 stars 1 forks source link

contract in Kotlin #37

Open cyrushine opened 1 year ago

cyrushine commented 1 year ago
// 为何1和2两处需要添加问号?,而3处则不需要,为什么呢?
fun printLength(str: String? = null) {
    println(str?.length) // 1

    if (!TextUtils.isEmpty(str)) { // 2
        println(str?.length) 
    }

    if (!str.isNullOrEmpty()) {  // 3
        println(str.length)
    }
}

@kotlin.internal.InlineOnly
public inline fun CharSequence?.isNullOrEmpty(): Boolean {
    contract {
        returns(false) implies (this@isNullOrEmpty != null)
    }
​
    return this == null || this.length == 0
}

contract(契约)是一种 Kotlin 面向编译器约定的一种规则,它帮助编译器更加智能地识别某些需要特定的代码条件,为代码创建更加友好的上下文关联环境。 Kotlin 在 1.3 版本以实验室功能的方式开始引入 contract, 截止至当前 Kotlin 最新版本 1.6.10,contract 方法依然添加有 @ExperimentalContracts 注解。

常见标准库函数run,also,with,apply,let,每个里面都用到contract契约:

@kotlin.internal.InlineOnly
public inline fun <T> T.apply(block: T.() -> Unit): T {
    contract {
        callsInPlace(block, InvocationKind.EXACTLY_ONCE)
    }
    block()
    return this
}

Kotlin 标准库随处可见的 contract 到底是什么? - 掘金 聊一聊Kotlin之contract - 掘金