我在Scala中尝试运算符优先级,这里发生了一些奇怪的事情:
class Op{
def +(that:Op):Op={println("called +");this}
def -(that:Op):Op={println("called -");this}
def *(that:Op):Op={println("called *");this}
def /(that:Op):Op={println("called /");this}
def %(that:Op):Op={println("called %");this}
}
val op = new Op;
op+op-op*op/op%op ;
op+op*op ;
对于第一行,输出为:
called +
called *
called /
called %
called -
(注意+
在*
之前调用。)但是,对于第二行,输出为:
called *
called +
(在*
之前调用+
。)我相信我在*
之前应该调用+
{{1}}。有什么我错的吗?
答案 0 :(得分:4)
Scala按优先级对表达式进行分组,然后严格从左到右评估组,从而坚持优先级。
您的第二个电话相当于
op.+(op.*(op))
从内到外进行评估。
与第一个电话相同:
op+op-op*op/op%op
,优先应用,
op+op-(op*op/op%op)
或
(op+op).-(op*op/op%op)
或
// 1 5 2 3 4
op.+(op).-(op.*(op)./(op).%(op))