2015-04-28 5 views
4

Скажем, у меня есть два класса и процедура, которая модифицирует любой класс таким же образом. Как указать, что параметр может быть либо классом (вместо перезаписи или перегрузки функции для каждого класса)? Простой пример:Определение параметров нескольких типов в 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 могут быть переданы в качестве переменных для процедур вместо базового класса.

ответ

4

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

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

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

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

+0

Это работает. В примере, который я дал, наследование может быть лучше. Скажем, у меня есть 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

Смежные вопросы