Scala中与apply方法对应的左值赋值操作如何实现?支持小括号赋值语法
Scala矩阵赋值语法实现方案
Scala完全支持你需要的这种括号语法赋值特性,无需直接暴露data成员或单独自定义setter方法,对应的语法糖依赖update方法实现。
语法规则
当编译器解析到obj(arg1, arg2, ..., argN) = value写法时,会自动将其转换为obj.update(arg1, arg2, ..., argN, value)的方法调用:
- 括号内的所有参数作为
update方法的前N个入参 - 等号右侧的赋值内容作为
update方法的最后一个入参
实现代码
修改后的Matrix类如下,还可以将data设为私有进一步提升封装性:
class Matrix(val n: Int, val m: Int, val default: Double = 0) { private val data: Array[Array[Double]] = Array.fill(n, m)(default) // 读操作:对应matrix(x,y)调用 def apply(x: Int, y: Int): Double = data(x)(y) // 写操作:对应matrix(x,y) = value调用 def update(x: Int, y: Int, value: Double): Unit = data(x)(y) = value }
调用示例
val matrix = new Matrix(3, 3) matrix(2, 2) = 5 // 等价于matrix.update(2, 2, 5) println(matrix(2, 2)) // 输出5,等价于println(matrix.apply(2,2))
补充说明
这种语法糖是Scala原生内置的,我们平时使用数组时的arr(0) = 10写法,本质就是调用了Array类的update方法,和Python的__setitem__、C++的括号运算符重载功能定位一致。
内容的提问来源于stack exchange,提问作者ticster
相关产品推荐
相关产品推荐

