首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Nim算子过载

Nim算子过载
EN

Stack Overflow用户
提问于 2015-04-05 19:53:34
回答 1查看 3.6K关注 0票数 7

刚开始用Nim语言编程(到目前为止,我真的很喜欢它)。作为一项学习练习,我正在编写一个小型矩阵库。我有更多的代码,但我只展示与这个问题相关的部分。

代码语言:javascript
复制
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

所有这些都很好,但我希望能够用以下内容替换最后一行

代码语言:javascript
复制
mat[1, 3] += 4.0

这是行不通的(也没有预料到)。如果我试一试,我就会得到

代码语言:javascript
复制
Error: for a 'var' type a variable needs to be passed

如何创建具有此行为的加法赋值运算符?我猜我需要点别的东西来完成这件事。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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()
票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29461573

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档