Дайте мне посмотреть, смогу ли я направить @raiph и ответить на этот вопрос наилучшим возможным способом. Здесь есть несколько ошибок.
Использование import
Основным вариантом использования import
является именно тот, который вы здесь делаете; описано в документации . Однако лучше поместить модули в разные файлы (с тем же именем, что и у модуля) и вместо этого перейти на use
. use
, который импортирует и включает все в пространство имен. use
загружается (через need
) и затем импортирует модуль ровно один раз.
Сохранить фигурные скобки, используя единицу измерения
unit
- это в основном синтаксический сахар для сохранения скобок. Итак, первые два файла станут:
Foo.pm6
unit module Foo;
role foo is export {
}
Bar.pm6
unit module Bar;
use Foo;
role bar is export does foo {}
use
из Foo
импортирует символ foo
напрямую, и его можно использовать в качестве роли.
Что такое роль
И последнее, но не менее важное: роль, которую он играет, - это буквально декларация "делает". Это не декларация "есть". Так что bar
может do
foo, но это не foo
. Что делает последний файл примерно таким:
use-foo-bar.p6
use Foo;
use Bar;
sub f(bar \k) { }
f(bar.new);
Обратите внимание, что я использовал bar \k
вместо foo \k
. Если бы я не сделал, ошибка будет: Type check failed in binding to parameter 'k'; expected Foo::foo but got Bar::bar (Bar::bar.new)
Вернуться к исходному сообщению
То, что было не так, было просто вложенным объявлением, которое должно было быть:
sub f(bar \k) { }
Из-за того, что объясняется в последнем разделе выше. Однако мне нужно было немного изучить остальную часть программы, чтобы выяснить это.