定义自定义中缀运算符

在 Scala 运算符(如+-*++等)中只是方法。例如,1 + 2 可以写成 1.+(2)。这些方法称为 中缀运算符

这意味着可以在你自己的类型上定义自定义方法,重用这些运算符:

class Matrix(rows: Int, cols: Int, val data: Seq[Seq[Int]]){
  def +(that: Matrix) = {
    val newData = for (r <- 0 until rows) yield
      for (c <- 0 until cols) yield this.data(r)(c) + that.data(r)(c)

    new Matrix(rows, cols, newData)
  }
}

这些运算符定义为方法可以像这样使用:

val a = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))
val b = new Matrix(2, 2, Seq(Seq(1,2), Seq(3,4)))

// could also be written a.+(b)
val sum = a + b  

请注意,中缀运算符只能有一个参数; 操作符之前的对象将在操作符之后在对象上调用它自己的操作符。任何带有单个参数的 Scala 方法都可以用作中缀运算符。

这应该与 parcimony 一起使用。只有当你自己的方法完全符合人们对该运算符的期望时,它通常被认为是一种良好的做法。如有疑问,请使用更保守的命名,例如 add 而不是+