Определение классов с несколькими версиями API вместе - PullRequest
6 голосов
/ 05 апреля 2020

Это не представляется возможным ...

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

1 Ответ

7 голосов
/ 05 апреля 2020

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

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

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

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>. По-видимому, это считается эквивалентным параметру no :api, в результате чего вместо 0.

появляется пустая строка.
...