Указание класса Perl 6 в переменной

У меня есть куча тестов Perl 6, которые начинаются с некоторых базовых тестов, в которых я помещаю имя класса для тестирования в переменную и использую эту переменную на протяжении всего теста:

my $package = 'Some::Class';
use-ok $package;

my $class = ::($package);   
can-ok $class, 'new';

Я некоторое время не обращал на это внимания, но это больше не работает, потому что классы теперь загружаются лексически:

Нет такого символа 'Some :: Class'

Это не сложное решение. Загрузите модуль без use-ok и в области, где я хочу ::($package):

use Some::Class;

...

Другие решения (возможно, за исключением уродливого EVAL) имеют проблему, которую я пытаюсь избежать.

Но мне это не особенно нравится, так как имя дважды появляется в файле. Мне особенно понравилась моя раньше работавшая идиома, которую я перенес из Perl 5. Если я хотел изменить имя класса, оно появлялось в файле только один раз. Я мог легко генерировать стандартные тесты (хотя исправить это не так уж сложно).

Есть ли способ вернуться к тому идеалу, которого я хотел? (Хотя я полагаю, что лексическая загрузка в следующей версии снова будет мешать).


person brian d foy    schedule 02.04.2017    source источник
comment
Я не знаю, чувак, может быть, я что-то здесь упускаю, но, похоже, у меня работает следующее: constant pkg = 'Test'; use ::(pkg);. Это то, что вы ищете?   -  person Jarrod Funnell    schedule 02.04.2017
comment
О, это сработает, я думаю. Сделайте это ответом.   -  person brian d foy    schedule 02.04.2017


Ответы (1)


Подводя итог проблеме: вы хотите загружать модули с помощью символа, а не жестко кодировать его. Использование константы должно сделать это за вас:

constant some-module = 'Some::Module';
use ::(some-module);

Вы также можете загрузить модуль во время выполнения, используя require, что позволит вычислять значения во время выполнения:

my $some-module = 'Some::Module';
require ::($some-module);
::($some-module).foo

Имеет смысл сделать это после того, как попробуете use-ok.

Для дополнительного кредита вы можете найти методы, описанные в этой статье, полезными. http://rakudo.org/2017/03/18/lexical-require-upgrade-info/

person Jarrod Funnell    schedule 02.04.2017