Скажем, у меня есть два класса и процедура, которая модифицирует любой класс таким же образом. Как указать, что параметр может быть либо классом (вместо перезаписи или перегрузки функции для каждого класса)? Простой пример:Определение параметров нескольких типов в 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 могут быть переданы в качестве переменных для процедур вместо базового класса.
Это работает. В примере, который я дал, наследование может быть лучше. Скажем, у меня есть Class1 [T] = объект RootObj' и 'Class2 [T] = объект класса1 [T]'. Похоже, мне все еще нужно написать процедуру как «proc addToX [T] (c: var (Class1 [T] | Class2 [T]), val: T) ='. Я бы предположил, что 'proc addToX [T] (c: var Class1 [T], val: T) =' будет достаточным, так как Class2 наследует Class1. – COM