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