【问题标题】:defining parameters of multiple types in Nim在 Nim 中定义多种类型的参数
【发布时间】:2018-01-24 21:21:42
【问题描述】:

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

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 类不能作为变量传递给过程来代替基类。

【问题讨论】:

    标签: parameter-passing nim-lang


    【解决方案1】:

    括号解决了这个问题,否则var 只适用于Class1[T]

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

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

    也许在您的用例中,对象变体或继承和方法会更好。

    【讨论】:

    • 这行得通。在我给出的示例中,继承可能会更好。假设我有Class1[T] = object of RootObjClass2[T] = object of Class1[T]。看来我仍然需要将程序编写为proc addToX[T](c: var (Class1[T]|Class2[T]), val: T) =。我原以为 proc addToX[T](c: var Class1[T], val: T) = 就足够了,因为 Class2 继承自 Class1。
    猜你喜欢
    • 1970-01-01
    • 2015-06-05
    • 1970-01-01
    • 1970-01-01
    • 2011-12-13
    • 2020-10-29
    • 1970-01-01
    • 2012-03-25
    相关资源
    最近更新 更多