使用“this”访问外部作用域变量

Using "this" accesses outer scope variable

提问人:user9277283 提问时间:8/26/2022 更新时间:8/26/2022 访问量:61

问:

我写了一个快速的小矩阵运算库,我想缩短这个函数的代码:

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-datadata[email protected]upper-data

Kotlin Matrix Scope JVM 这个

评论


答:

0赞 Joffrey 8/26/2022 #1

首先,我发现设计是有问题的。您有效地遍历了实现中矩阵的元素,但从 API 的角度来看,您忽略了它们(仅提供 i/j 坐标)。另外,为什么要返回矩阵本身?loopThrough

从技术上讲,目前所做的只是帮助调用者编写一个循环,他们本可以用公共和属性自己编写。loopThroughrowscols

如果您向 lambda 添加一个具有实际单元格值的参数,这将使此 API 更有用 IMO(您可以调用它来遵循约定):actionforEachIndexed

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 约定,因为它创建了一个新矩阵,同时可以理解为改变当前矩阵(有关列表,请参见 /)。transposedtransposesortsorted

另外,不需要在这里。datavar

评论

0赞 user9277283 8/28/2022
好吧,我看到了其他矩阵库是如何做到这一点的,我最终按照你说的方式编写了它。我只是出于好奇而把这个问题贴出来,看看是否有其他方法。