Циклическое перебор классов с использованием require

У меня есть несколько классов плагинов, каждый из которых имеет метод «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)
}

Я пробовал различные синтаксисы, ни один из которых не работал.

Каким будет способ сделать это?

Идеальный вопрос будет «Опишите, что вы уже пробовали, и результаты каких-либо исследований» . Вы сделали что-то большее, чем просто попробовали «разнообразие синтаксисов»? Вы не упомянули try, но пробовали ли вы это? Вы не упомянули поиск (проблемы с Google, SO, Rakudo), но вы тоже это пробовали? Я поискал в проблемах Rakudo запрос «попробуй потребовать пакеты»; ты пробовал что-то подобное? Пожалуйста, рассмотрите возможность добавления такой информации в ваш вопрос TIA!

raiph 05.07.2024 14:57

@raiph вся разумная критика. Я стараюсь задавать минимум вопросов. Да, много поисков.

Richard Hainsworth 05.07.2024 15:53
Сила классов Java: сравнение с языком C
Сила классов Java: сравнение с языком C
Абстракция" - это процесс упрощения сложных сущностей или концепций реального мира с целью их применения в форме программирования. В Java класс...
3
2
66
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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, связанную с символом пакета, соответствующим required пакету. Таким образом, даже если бы пакет был найден, я не смог бы использовать символ пакета.


Мое второе ключевое открытие заключалось в том, что в очереди задач Rakudo, похоже, было много связанных с этим открытых проблем. Например: 1 , 2 , 3.

Вы правильно догадались насчет Q. Я думал, что ошибся с синтаксисом, потому что не мог запустить код. Оказывается, это может быть проблема с RakuAst или что-то еще. Мне следовало включить сообщение об ошибке: Невозможно найти атрибуты в объекте типа RakuAST::Package. Вы забыли «.new»? Спасибо за подтверждение, что у меня правильный синтаксис и что что-то подобное работает без прагмы use experimental.

Richard Hainsworth 05.07.2024 16:15

Другие вопросы по теме