Kotlin中能否检测运算符优先级与括号对运算结果的影响?
结论
无法仅通过修改plus运算符函数的内部逻辑实现你要的差异化表现,原因如下:
- Kotlin的括号分组、运算符优先级属于编译期语法解析阶段的逻辑,两种写法
foo1+foo2+foo3和(foo1+foo2)+foo3的运算顺序完全一致,编译生成的字节码没有任何区别,运行期执行plus函数时,不会携带任何「代码书写时是否加了括号」的信息,自然也无法做判断。 - 你当前的plus实现违背了Kotlin运算符重载的官方约定:
plus运算符本应返回新的实例、不修改原有接收者对象,你直接修改接收者本身的实现本身就会带来很多反直觉的问题。
替代实现方案
如果要实现类似的效果,可以主动给运算中间结果加标记,示例代码如下:
data class Foo(var name: String, private var isBracketed: Boolean = false) { operator fun plus(foo: Foo): Foo { name = if (isBracketed) { "($name)${foo.name}" } else { name + foo.name } isBracketed = false return this } // 手动标记当前对象是括号内的运算结果 fun bracket() = apply { isBracketed = true } }
使用方式:
// 普通写法,输出123 val foo1 = Foo("1") val foo2 = Foo("2") val foo3 = Foo("3") foo1 + foo2 + foo3 println(foo1.name) // 输出123 // 需要括号效果的写法,输出(12)3 val foo4 = Foo("1") val foo5 = Foo("2") val foo6 = Foo("3") (foo4 + foo5).bracket() + foo6 println(foo4.name) // 输出(12)3
内容的提问来源于stack exchange,提问作者Jojo01
相关产品推荐
相关产品推荐

