arrays - 创建矩阵 - “值更新不是 Example.Matrix 的成员”错误
问题描述
我正在尝试创建一个简单的矩阵(基本上是移植我用 C++ 编写的一些代码以更好地理解 Scala)。我写的代码是:
object Example extends App {
case class Matrix(rows: Int = 1, columns: Int = 1) {
val data = Array.fill[Int](rows * columns)(0)
def apply(i: Int, j: Int) = this.data(i * columns + j)
}
val grid = Matrix()
grid(0, 0) = 10
}
这不会编译,但据我所知,这在逻辑上等同于我的工作 C++ 示例。显然,由于 apply 功能,正在发生一些奇怪的事情。
有人可以解释为什么这段代码没有编译吗?我似乎无法弄清楚。
非常感谢任何指导!
解决方案
val foo = gir(0, 0)
会打电话apply
,但grid(0, 0) = foo
会打电话update
。
您需要像这样定义它:
def update(i: Int, j: Int, x: Int): Unit = {
this.data(i * columns + j) = x
}
顺便说一句,案例类不能是可变的!所以,请使用普通类。而且,私有化
可能会很好。data
无论如何,一般的可变性以及数组在Scala中并不常见。恕我直言,更好地理解Scala的最佳方式不是尝试移植命令式代码,而是重新考虑针对相同问题的函数式解决方案。
推荐阅读
- python - Wagtail - 如何(正确)获取其他页面/模型
- html - CSS background-image 不显示外部/直接图像 url
- python - Pip 不工作,说它不能造轮子
- php - 添加到我的 CSS 的任何更改都不再应用于我的 PHP
- react-native - 排毒获取元素的长度
- java - 在此代码中,对于 while 循环内的条件,错误显示“除以零”。为什么会这样?
- javascript - NodeJS:Promise 或 Fork 用于耗时(2-5 分钟)的功能
- javascript - x 什么时候不等于 x?
- python - 如何在 pandas 中链接样式函数的条件?
- php - 我可以在 laravel 中使用相同的控制器名称 2 次或更多次吗?