Kotlin中使用if表达式结合also作用域函数时的调用异常问题
Kotlin中使用if表达式结合also作用域函数时的调用异常问题
兄弟,你遇到的问题其实是代码结构的语法绑定错误,不是Kotlin的bug哦!
你看你写的第二种代码,把.also直接挂在了最后一个else的代码块后面,这就导致只有当进入else分支(也就是isBold和isItalic都为false的时候),才会触发also里的updateTypeface调用。而其他分支(比如isBold=true、isItalic=false)的结果并没有被链式调用also——哪怕你断点打到了Typeface.BOLD那一行,也只是说明进入了该分支,但分支的返回值没有被后续的also处理,自然不会执行updateTypeface。
你写的错误代码结构本质上等价于这样:
if (isBold && isItalic) { Typeface.BOLD_ITALIC } else if (isBold) { Typeface.BOLD } else if (isItalic) { Typeface.ITALIC } else { // 只有进入这个分支时,才会调用also Typeface.NORMAL.also { typeface -> updateTypeface(typeface) } }
正确的做法是把整个if表达式用括号括起来,让.also绑定到整个if表达式的返回值上,这样不管哪个分支的结果,都会触发also里的逻辑:
(if (isBold && isItalic) { Typeface.BOLD_ITALIC } else if (isBold) { Typeface.BOLD } else if (isItalic) { Typeface.ITALIC } else { Typeface.NORMAL }).also { typeface -> updateTypeface(typeface) }
如果觉得括号麻烦,也可以省略分支里的大括号(因为每个分支只有一行代码),这样结构更清晰,也不会出现绑定错误:
if (isBold && isItalic) Typeface.BOLD_ITALIC else if (isBold) Typeface.BOLD else if (isItalic) Typeface.ITALIC else Typeface.NORMAL .also { updateTypeface(it) }
备注:内容来源于stack exchange,提问作者Leonardo Sibela
相关产品推荐
相关产品推荐

