Nim运算符重载

COM*_*COM 5 operator-overloading nim-lang

刚开始用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
Run Code Online (Sandbox Code Playgroud)

所有这一切都很好,但我希望能够用类似的东西替换最后一行

mat[1, 3] += 4.0
Run Code Online (Sandbox Code Playgroud)

这不起作用(也没想到).如果我试试,我明白了

Error: for a 'var' type a variable needs to be passed
Run Code Online (Sandbox Code Playgroud)

如何创建具有此行为的附加赋值运算符?我猜我需要一些东西而不是一个触发来完成这个.

def*_*ef- 6

有两种方法可以做到这一点: