提问人:user9277283 提问时间:8/26/2022 更新时间:8/26/2022 访问量:61
使用“this”访问外部作用域变量
Using "this" accesses outer scope variable
问:
我写了一个快速的小矩阵运算库,我想缩短这个函数的代码:
private fun transpose(): Matrix {
val result = Matrix(cols, rows)
loopThrough { row, col ->
result.data[col][row] = data[row][col]
}
return result
}
我的 matrix 类是这样的:
class Matrix(val rows: Int, val cols: Int) {
var data = Array(rows) {FloatArray(cols) {0f} }
//some other stuff
fun loopThrough(action: (i: Int, j: Int) -> Unit): Matrix {
data.forEachIndexed { row, it -> it.forEachIndexed { col, _ ->
action(row, col)
}}
return this
}
}
我试图做的是:
class Matrix(val rows: Int, val cols: Int) {
//somewhere in matrix class
val data = //2d array like above: lets call this upper-data
fun transpose() = Matrix(cols,rows).loopThrough { row,col ->
data[row][col] = [email protected][col][row] // i want data[row][col] to refer to the new Matrix's data
// [email protected] is upper-data
}
}
抱歉,如果这令人困惑,但我想将新矩阵的数据设置为更改后的 .但是,据我了解,两者都参考了.
如何在其loopThrough函数中调用新矩阵的数据?(如果你不糊涂,恭喜你)upper-data
data
[email protected]
upper-data
答:
0赞
Joffrey
8/26/2022
#1
首先,我发现设计是有问题的。您有效地遍历了实现中矩阵的元素,但从 API 的角度来看,您忽略了它们(仅提供 i/j 坐标)。另外,为什么要返回矩阵本身?loopThrough
从技术上讲,目前所做的只是帮助调用者编写一个循环,他们本可以用公共和属性自己编写。loopThrough
rows
cols
如果您向 lambda 添加一个具有实际单元格值的参数,这将使此 API 更有用 IMO(您可以调用它来遵循约定):action
forEachIndexed
class Matrix(val rows: Int, val cols: Int) {
val data = Array(rows) { FloatArray(cols) { 0f } }
fun forEachIndexed(action: (i: Int, j: Int, value: Float) -> Unit) {
data.forEachIndexed { i, row ->
row.forEachIndexed { j, value ->
action(i, j, value)
}
}
}
fun transposed(): Matrix = Matrix(cols, rows).also { newMatrix ->
forEachIndexed { i, j, value -> newMatrix.data[j][i] = value }
}
}
此外,该名称将更好地匹配 stdlib 约定,因为它创建了一个新矩阵,同时可以理解为改变当前矩阵(有关列表,请参见 /)。transposed
transpose
sort
sorted
另外,不需要在这里。data
var
评论
0赞
user9277283
8/28/2022
好吧,我看到了其他矩阵库是如何做到这一点的,我最终按照你说的方式编写了它。我只是出于好奇而把这个问题贴出来,看看是否有其他方法。
评论