如何修改自定义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)