刚开始用Nim语言编程(到目前为止,我真的很喜欢它)。作为一项学习练习,我正在编写一个小型矩阵库。我有更多的代码,但我只展示与这个问题相关的部分。
type
Matrix*[T; nrows, ncols: static[int]] = array[0 .. (nrows * ncols - 1), T]
# Get the index in the flattened array corresponding
# to row r and column c in the matrix
proc index(mat: Matrix, r, c: int): int =
result = r * mat.ncols + c
# Return the element at r, c
proc `[]`(mat: Matrix, r, c: int): Matrix.T =
result = mat[mat.index(r, c)]
# Set the element at r, c
proc `[]=`(mat: var Matrix, r, c: int, val: Matrix.T) =
mat[mat.index(r, c)] = val
# Add a value to every element in the matrix
proc `+=`(mat: var Matrix, val: Matrix.T) =
for i in 0 .. mat.high:
mat[i] += val
# Add a value to element at r, c
proc `[]+=`(mat: var Matrix, r, c: int, val: Matrix.T) =
mat[mat.index(r, c)] += val
# A test case
var mat: Matrix[float, 3, 4] # matrix with 3 rows and 4 columns
mat[1, 3] = 7.0
mat += 1.0
# add 8.0 to entry 1, 3 in matrix
`[]+=`(mat, 1, 3, 8.0) # works fine所有这些都很好,但我希望能够用以下内容替换最后一行
mat[1, 3] += 4.0这是行不通的(也没有预料到)。如果我试一试,我就会得到
Error: for a 'var' type a variable needs to be passed如何创建具有此行为的加法赋值运算符?我猜我需要点别的东西来完成这件事。
发布于 2015-04-05 20:36:43
有两种方法可以做到这一点:
[]用于var Matrix并返回var T (这需要Nim的当前开发分支):
proc [](mat:矩阵,r,c: int):Matrix.T = result = matmat.index(r,c) proc [](mat: var矩阵,r,c: int):var Matrix.T = matmat.index(r,c)[]成为模板,而不是:
模板[](mat:矩阵,r,c: int):expr = matmat.index(r,c)
当mat不是值,而是更复杂的值时,这会引起问题:
proc x: Matrixfloat,2,2= echo "x()“var y= x()1,0
这印了两次x()。https://stackoverflow.com/questions/29461573
复制相似问题