我遇到了一个有趣的问题。调试应用程序时,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逻辑猫:
qwe发布于 2017-08-20 19:39:30
为了确定发生了什么,您应该在lambda中打印it。但可能发生的是:
isResColorId.then(this.let({...})) ?: colorId这意味着let中的块总是被计算出来的。
发布于 2017-08-20 20:07:57
如果不想计算infix函数的第二个参数(如果第一个参数为false ),则应该传递一个lambda,而不是一个值:
inline infix fun <T> Boolean.then(block: () -> T): T? = if (this) block() else null但是在这种情况下,我更愿意直接编写if (condition) A else B,而不是返回一个可为空的值,该值引入装箱,并迫使您在使用elvis运算符之后检查null。
https://stackoverflow.com/questions/45786071
复制相似问题