Kotlin - 是否可以检查运算符优先级

Kotlin - Is it possible to check for operator precedence

假设我有以下 class:

data class Foo(var name: String) {
    operator fun plus(foo: Foo): Foo {
        name += foo.name
        return this
    }
}

然后这样使用:

val foo1 = Foo("1")
val foo2 = Foo("2")
val foo3 = Foo("3")

foo1+foo2+foo3
println(foo1.name) // 123

现在,如果我想要不同的行为取决于操作是否像这样链接:

foo1+foo2+foo3

或者像这样:

(foo1+foo2)+foo3

在这两种情况下,foo1 的名称都是 123,但假设在第二种情况下,我希望 foo1 的名称是 (12)3。

有没有办法给 plus 函数添加一个条件,它会检查调用它的 foo 是否来自 parentheses/has 更高的优先级。

不,那是不可能的,因为那毫无意义。编译器只会解析操作顺序,括号只是表示应该先解析1+2,结果应该加上3。结果中没有括号的概念,你有结果。

让您感到困惑的是,您正在滥用 plus 功能来做一些人们不会想到的事情。您不应该使用 plus 函数来改变它所调用的对象,这不是预期的行为。用户会期望 plus 函数 return 一个新对象,而不是左操作数或右操作数的突变。

你的情况:

operator fun plus(foo: Foo): Foo {
    return Foo(name += foo.name)
}

不要做不同的事情,以免让其他人感到困惑。 Fyi plusAssign 是一个变异函数,但仍然不允许你做你想做的事。为此,您可能需要编写自己的解析器并自己解析操作数和运算符。