在 Nim 中定义多种类型的参数
defining parameters of multiple types in Nim
假设我有两个 classes 和一个以相同方式修改任一 class 的过程。如何指定参数可以是 class(而不是为每个 class 重写或重载函数)?一个简单的例子:
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
如果我对每个 class 使用单独的程序,一切正常。
proc addToX[T](c: var Class1[T], val: T) =
c.x += val
proc addToX[T](c: var Class2[T], val: T) =
c.x += val
这只是一个简单的例子,很容易重写函数。但我希望针对更复杂的 classes 和程序执行此操作。在某些情况下,继承可能是合适的,但 Nim classes 似乎不能作为变量传递给过程来代替基础 class.
括号解决了这个问题,否则 var
只适用于 Class1[T]
:
proc addToX[T](c: var (Class1[T]|Class2[T]), val: T) =
您稍后可能会 运行 进入另一个编译器错误:https://github.com/nim-lang/Nim/issues/1385
也许在您的用例中对象变体或继承和方法会更好。
假设我有两个 classes 和一个以相同方式修改任一 class 的过程。如何指定参数可以是 class(而不是为每个 class 重写或重载函数)?一个简单的例子:
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
如果我对每个 class 使用单独的程序,一切正常。
proc addToX[T](c: var Class1[T], val: T) =
c.x += val
proc addToX[T](c: var Class2[T], val: T) =
c.x += val
这只是一个简单的例子,很容易重写函数。但我希望针对更复杂的 classes 和程序执行此操作。在某些情况下,继承可能是合适的,但 Nim classes 似乎不能作为变量传递给过程来代替基础 class.
括号解决了这个问题,否则 var
只适用于 Class1[T]
:
proc addToX[T](c: var (Class1[T]|Class2[T]), val: T) =
您稍后可能会 运行 进入另一个编译器错误:https://github.com/nim-lang/Nim/issues/1385
也许在您的用例中对象变体或继承和方法会更好。