【发布时间】:2017-01-27 06:46:43
【问题描述】:
是否可以修改任何自定义运算符的优先级? 例如,我用完全自定义的运算符实现初等算术。
case class Memory(name:String){
var num:Num = null
def <<=(x:Num): Unit = {
println(s"assign ${x.value}")
this.num = x
}
}
case class Num(var value:Int) {
def +|+(x:Num) = {
println("%d + %d = %d".format( value,x.value,x.value + value ))
Num(value + x.value)
}
def *|*(x:Num) = {
println("%d * %d = %d".format( value,x.value,x.value * value ))
Num(value * x.value)
}
}
val m1 = Memory("R")
val a = Num(1)
val b = Num(3)
val c = Num(9)
val d = Num(12)
m1 <<= a *|* b +|+ c +|+ d *|* a
println("final m1 ",m1.num.value)
结果是
1 * 3 = 3
3 + 9 = 12
12 * 1 = 12
12 + 12 = 24
assign 24
(final m1 ,24)
显然优先级是正确的。我希望*|* 与* 和+|+ 与+ 具有相同的优先级,<<= 也与= 等效。 scala 是如何计算出来的?
【问题讨论】:
-
@jwvh 你是对的。订单正是我想要的。但我不知道 scala 如何计算出正确的优先级?
标签: scala operator-overloading operator-precedence