Android kotlin 中缀问题
Android kotlin infix issue
我遇到了一个有趣的问题。当我调试我的应用程序时 isResColorId
是 false
。不幸的是,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
。
我遇到了一个有趣的问题。当我调试我的应用程序时 isResColorId
是 false
。不幸的是,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
。