Определение параметров нескольких типов в 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 ответ

Решение

Скобка решает эту проблему, в противном случае var относится только к Class1[T]:

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

Позже вы можете столкнуться с другой ошибкой компилятора: https://github.com/nim-lang/Nim/issues/1385

Возможно, в вашем случае объектные варианты или наследование и методы будут работать лучше.

Другие вопросы по тегам