如何修改自定义scala运算符';优先
是否可以修改任何自定义运算符的优先级? 例如,我使用完全自定义的运算符实现基本算法如何修改自定义scala运算符';优先,scala,operator-overloading,operator-precedence,Scala,Operator Overloading,Operator Precedence,是否可以修改任何自定义运算符的优先级? 例如,我使用完全自定义的运算符实现基本算法 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:N
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)
显然,优先级是正确的。我希望
*.*
的优先级与*
相同,+.+
的优先级与+
相同,回答有关修改运算符优先级的问题-要更改它,基本上只需更改自定义运算符的第一个字符-这就是scala通过查看第一个字符来计算中缀运算符优先级的方法。因此,如果您添加运算符*|+
:
它将具有与*.*
相同的优先级,就像*
和*
一样
与*
和+
一样,优先级比+|+
大
不幸的是,现在没有其他办法来解决这个问题。没有自定义注释/权重等,以避免阅读代码过于模糊
这里很好地总结了优先规则-
关于你的问题-你得到了正确的结果
*|*
和*
都是左关联运算符,它们的第一个字符是*
,因此它们具有相同的优先级
您的操作:
a*|*b+|+c+|+d*|*a
转化为
a*b+c+d*a
,即1*3+9+12*1
应用标准优先规则-(a*b)+c+(d*a)
结果是24。@jwvh您是对的。订单正是我想要的。但我不知道scala figure是如何纠正优先级的?为了完整性,值得一提的是上面规则的例外,以:
结尾的操作是正确的关联。例如,list cons操作符(:
)如何知道类型是list
——它从最后一个元素Nil
派生出来。
1 * 3 = 3
3 + 9 = 12
12 * 1 = 12
12 + 12 = 24
assign 24
(final m1 ,24)