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

时间:2017-06-09 17:35:50

标签: scala operator-precedence

我在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}}。有什么我错的吗?

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