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 是一个变异函数,但仍然不允许你做你想做的事。为此,您可能需要编写自己的解析器并自己解析操作数和运算符。
假设我有以下 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 是一个变异函数,但仍然不允许你做你想做的事。为此,您可能需要编写自己的解析器并自己解析操作数和运算符。