在Nim中定义多个类型的参数

时间:2015-04-28 04:24:55

标签: parameter-passing nim

假设我有两个类和一个以相同方式修改任一类的过程。如何指定参数可以是类(而不是为每个类重写或重载函数)?一个简单的例子:

type 
  Class1[T] = object
    x: T

  Class2[T] = object
    x: T
    y: T

# this works fine
proc echoX[T](c: Class1[T]|Class2[T]) =
  echo c.x

# this does not work
proc addToX[T](c: var Class1[T]|Class2[T], val: T) =
  c.x += val


var c1: Class1[int]
var c2: Class2[int]

# this works fine
echoX(c1)
echoX(c2)

# this does not work
addToX(c1, 10)
addToX(c2, 100)

我收到以下错误。

Error: for a 'var' type a variable needs to be passed

如果我为每个课程使用单独的程序,那么事情就可以了。

proc addToX[T](c: var Class1[T], val: T) =
  c.x += val

proc addToX[T](c: var Class2[T], val: T) =
  c.x += val

这只是一个简单的例子,它可以很容易地重写这个功能。但是我希望为更复杂的课程和程序做这件事。在某些情况下,继承可能是合适的,但它似乎不能将Nim类作为变量传递给代替基类的过程。

1 个答案:

答案 0 :(得分:4)

括号修复此问题,否则var仅适用于Class1[T]

proc addToX[T](c: var (Class1[T]|Class2[T]), val: T) =

稍后您可能会遇到另一个编译器错误:https://github.com/nim-lang/Nim/issues/1385

也许在您的用例对象中,variantes或继承和方法将更好地工作。