2013-05-02 77 views
1

使用Array可以使用val i = xs(0)xs(0) = i语法获取和设置元素。如何在我自己的类中实现这个功能?到目前为止,我只能实现获取值。使用apply设置实例变量

class Matrix(val m : Int, val n : Int) { 
    val matrix = Array.ofDim[Double](m, n) 

    def apply(i:Int)(j:Int) = matrix(i)(j) 
} 

更新:感谢Mauricio回答关于update方法。这是最终版本

class Matrix(val m:Int, val n:Int) { 
    private val matrix = Array.ofDim[Double](m, n) 
    def apply(i:Int) = new { 
    def apply(j:Int) = matrix(i)(j) 

    def update(j:Int, v:Double) = { matrix(i)(j) = v } 
    } 
} 

it("matrix") { 
    val m = new Matrix(3, 3) 
    m(0)(1) = 10.0 
    val x = m(0)(1) 

    x should equal(10.0) 
    x.isNegInfinity should be (false) // Implicits for Double work! 
} 

回答

2

你需要声明一个update方法:

class Matrix(val m : Int, val n : Int) { 
    private val matrix = Array.ofDim[Double](m, n) 

    def apply(i:Int)(j:Int) = matrix(i)(j) 

    def update(i : Int, j : Int, value : Double) { 
    matrix(i)(j) = value 
    } 

} 

val m = new Matrix(10, 10) 
m(9, 9) = 50 
+0

感谢。因此,如果我想使用与multidim数组完全相同的语法,则需要使用update和apply方法来实现MatrixRow类,并从Matrix的apply中返回它。有没有办法创建一些匿名类而不是显式类定义? – synapse 2013-05-02 03:35:52

+0

调用者不会知道匿名类实现什么方法,除非您将其设为特征并返回由返回的匿名对象实现的特征。 – 2013-05-02 03:51:19

+0

它看起来就像没有特质的类型分类。我已经用可用的代码更新了问题。 – synapse 2013-05-02 04:34:09