相当于 Scala 中的左手应用

Left handed equivalent of apply in Scala

在 Scala 中定义类似于二维矩阵 class 的东西非常容易,使用 apply 方法可以让我优雅地访问我的矩阵中的值。很简单,一个人会这样做:

class Matrix(val n: Int, val m: Int, val default: Double = 0) {
  val data: Array[Array[Double]] = Array.fill(n, m)(default)
  def apply(x: Int, y: Int): Double = data(x)(y)
}

这使我可以像这样访问矩阵中的元素:

val matrix = new Matrix(3, 3)
println(matrix(2, 2))

然而,我所追求的是能够做相反的事情,并使用类似的符号实际将值分配给矩阵。本质上我希望能够写出这样的东西:

matrix(2, 2) = 5

在 Scala 中有什么方法可以做到这一点吗?在 C++ 中,这可以通过将括号运算符重载为 return 引用而不是副本来实现(前者定义 setter,后者定义 getter),类似地 Python 这是 __getitem____setitem__ 魔术方法之间的区别(应用于方括号而不是圆括号的细微差别)。 Scala 是否支持这种行为,或者我是否不得不直接访问 data 成员 and/or 只是编写一个 setter 函数?

Array#update为例:

  /** Update the element at given index.
   *
   *  Note the syntax `xs(i) = x` is a shorthand for `xs.update(i, x)`.
   *
   *  @param    i   the index
   *  @param    x   the value to be written at index `i`
   */
  def update(i: Int, x: T): Unit

尝试实施 update:


class Matrix(val n: Int, val m: Int, val default: Double = 0) {
  ...
  def update(x:Int, y: Int, value: Double): Unit =
   ???
}


matrix(2,2) = 5d

编辑:
您实际上可以使用:

  • def update(x:Int, y: Int, value: Double): Unit

而不是:

  • def update(coord: (Int,Int), value: Double): Unit.

并获得您想要的语法。