相当于 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
.
并获得您想要的语法。
在 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
.
并获得您想要的语法。