Совместное определение классов с несколькими версиями API

Очевидно, это невозможно ...

role Versioned {
    method version () {
        return self.^api;
    }
}

class WithApi:ver<0.0.1>:auth<github:JJ>:api<0> does Versioned {}
class WithApi:ver<0.0.1>:auth<github:JJ>:api<1> does Versioned {}

say WithApi:api<0>.new.version;
say WithApi:api<1>.new.version;

Это умирает с

==SORRY!=== Error while compiling /home/jmerelo/progs/perl6/my-perl6-examples/api-versioned.p6
Redeclaration of symbol 'WithApi'
at /home/jmerelo/progs/perl6/my-perl6-examples/api-versioned.p6:11
------> 1>:auth<github:JJ>:api<1> does Versioned⏏ {}

Так возможно ли вообще use классы с разными api, одинаковыми именами в одной программе?

Обновление: если они включены в разные файлы, получается следующая ошибка:

P6M Merging GLOBAL symbols failed: duplicate definition of symbol WrongType

person jjmerelo    schedule 05.04.2020    source источник


Ответы (1)


В этом примере две вещи создают проблему:

  • class по умолчанию our, что вызывает конфликт имен
  • короткое имя класса такое же во внешнем пространстве имен, что вызывает конфликт

Если немного адаптировать код:

role Versioned {
    method version () {
        return self.^api;
    }
}

my constant one = my class WithApi:ver<0.0.1>:auth<github:JJ>:api<1> does Versioned {}
my constant two = my class WithApi:ver<0.0.1>:auth<github:JJ>:api<2> does Versioned {}

say one.version;  # 1
say two.version;  # 2

Я обнаружил, что есть ошибка для :api<0>. По-видимому, это считается эквивалентом настройки нет :api, в результате чего вместо 0 получается пустая строка.

person Elizabeth Mattijsen    schedule 05.04.2020
comment
Как это отразится на создании двух файлов с разными версиями API класса? У экспортируемого символа должно быть другое имя? - person jjmerelo; 05.04.2020
comment
Пока мы не реализуем поддержку :as, один из способов сделать это - импортировать файлы в двух разных блоках. Что-то вроде: constant Foo = do { use Test; Test }; dd Foo; # Test - person Elizabeth Mattijsen; 05.04.2020