Scala 中的运算符优先级表现得很奇怪

Operator precedence in scala behaves strange

我在 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 +

*+ 之前被调用。)根据我读到的 here 我相信 * 应该在 + 之前被调用。是不是我弄错了什么?

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))