У меня есть несколько классов плагинов, каждый из которых имеет метод «enable». Следующий код работает
unit class Top;
has $!rdp;
use Plugin::A;
use Plugin::B;
use Plugin::C;
submethod TWEAK {
my $rdp := self.rdp;
Plugin::A.new.enable($rdp);
Plugin::B.new.enable($rdp);
Plugin::C.new.enable($rdp);
}
Классы Plugin...
используются только один раз для подготовки $rdp
, поэтому я подумал, что не имеет значения, будут ли классы просматриваться во время выполнения или во время компиляции.
Я хотел бы что-то в форме
for <A B C> {
require ::("Plugin::$_");
::("Plugin::$_").new.enable($rdp)
}
Я пробовал различные синтаксисы, ни один из которых не работал.
Каким будет способ сделать это?
@raiph вся разумная критика. Я стараюсь задавать минимум вопросов. Да, много поисков.
TL;DR Я догадался, что вы имеете в виду. Я могу быть далеко, поэтому этот ответ может быть бесполезным. Даже если я угадал правильно, ответ все равно может быть бесполезным или скрывать проблемы, которые выйдут на поверхность через месяцы/годы, поскольку существуют связанные проблемы с загрузкой открытых пакетов, которые не были полностью отлажены, поэтому любое решение — это всего лишь обходной путь, который работает в в данном выпуске Rakudo, но может не работать в следующем.
Я предполагаю, что вы ищете что-то вроде этого, которое работает в Rakudo (с 2022 года), установленном на glot.io на момент написания этой статьи (2024 год):
for <A B C> {
my $OK = True;
require ::("Plugin::$_");
CATCH { $OK = False; .resume }
::("Plugin::$_").new.enable($rdp) if $OK
}
Я говорю «предположительно», потому что есть много способов интерпретировать то, что вы написали, и вы не предоставили Минимальный воспроизводимый пример, чтобы уменьшить двусмысленность.
Моим первым ключевым открытием, когда я исследовал ваш вопрос, было то, что использование префикса try
в require
, по-видимому, нарушает упреждающую работу времени компиляции Rakudo, связанную с символом пакета, соответствующим require
d пакету. Таким образом, даже если бы пакет был найден, я не смог бы использовать символ пакета.
Мое второе ключевое открытие заключалось в том, что в очереди задач Rakudo, похоже, было много связанных с этим открытых проблем. Например: 1 , 2 , 3.
Вы правильно догадались насчет Q. Я думал, что ошибся с синтаксисом, потому что не мог запустить код. Оказывается, это может быть проблема с RakuAst или что-то еще. Мне следовало включить сообщение об ошибке: Невозможно найти атрибуты в объекте типа RakuAST::Package. Вы забыли «.new»? Спасибо за подтверждение, что у меня правильный синтаксис и что что-то подобное работает без прагмы use experimental
.
Идеальный вопрос будет «Опишите, что вы уже пробовали, и результаты каких-либо исследований» . Вы сделали что-то большее, чем просто попробовали «разнообразие синтаксисов»? Вы не упомянули
try
, но пробовали ли вы это? Вы не упомянули поиск (проблемы с Google, SO, Rakudo), но вы тоже это пробовали? Я поискал в проблемах Rakudo запрос «попробуй потребовать пакеты»; ты пробовал что-то подобное? Пожалуйста, рассмотрите возможность добавления такой информации в ваш вопрос TIA!