使用 apply 方法在 Scala 中定義類似二維 Matrix 類的東西非常容易,該方法可以讓我優雅地訪問 Matrix 中的值。很簡單,一個人會這樣做:
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 中,這可以通過多載括號運算子來回傳參考而不是副本來實作(前者定義了 setter,后者定義了 getter),同樣在 Python 中,這是 the__getitem__和__setitem__magic 方法之間的區別(與適用于方括號而不是圓括號)。Scala 是否支持這種行為,還是我不得不直接訪問data成員和/或只撰寫一個 setter 函式?
uj5u.com熱心網友回復:
以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.
并準確獲得您想要的語法。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/372698.html
