Android kotlin 中缀问题

Android kotlin infix issue

我遇到了一个有趣的问题。当我调试我的应用程序时 isResColorIdfalse。不幸的是,let 功能被触发,我在 logcat 上看到 qwe

fun drawableTint(context: Context, view: View, colorID: Int, isResColorId: Boolean = true) {
    try {
        val wrap = DrawableCompat.wrap(view.background)
        DrawableCompat.setTint(wrap, isResColorId then let { Timber.d("qwe"); ContextCompat.getColor(context, colorID) } ?: colorID)
        view.setBackgroundDrawable(wrap)
    }catch (e: Resources.NotFoundException){
        Timber.e(e, "c_id: $colorID coz: $isResColorId")
    }
}

infix fun <T> Boolean.then(param: T): T? = if (this) param else null

Logcat:

qwe

要确定发生了什么,您应该在 lambda 内部打印 it。但可能发生的情况是:

isResColorId.then(this.let({...})) ?: colorId

这意味着 let 中的块总是被评估。

如果你不想在第一个参数为假时计算中缀函数的第二个参数,你应该传递一个 lambda 而不是一个值:

inline infix fun <T> Boolean.then(block: () -> T): T? = if (this) block() else null

但在这种情况下,我宁愿直接写 if (condition) A else B,而不是返回一个可空的值,它会引入装箱并强制您事后使用 elvis 运算符检查 null