scala 中的运算符优先级行为很奇怪



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

(*+之前调用。我相信从我在这里读到的内容来看,*应该在+之前被称为.我做错了什么吗?

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

最新更新