Как правильно загрузить модули Raku, используя rakudo-star? - PullRequest
6 голосов
/ 05 марта 2020

У меня есть следующий проект

$ tree
.
├── lib
│   └── MyModule.raku
└── main.raku

$ cat lib/MyModule.raku
use v6;
unit module MyModule;
sub hello { say 'hello' }

$ cat lib/main.raku
use v6;
use MyModule;
MyModule.hello();

Я бы хотел запустить main.raku, используя самое последнее rakudo-star изображение . Однако происходит следующее

$ docker run -i --rm -u $(id -u) \
--workdir /work \
--volume  $PWD:/work \
--entrypoint bash \
rakudo-star perl6 -I ./lib main.raku
===SORRY!===
Could not find MyModule at line 3 in:
    file#/work/lib
    inst#/.perl6
    inst#/usr/share/perl6/site
    inst#/usr/share/perl6/vendor
    inst#/usr/share/perl6
    ap#
    nqp#
    perl5#

Я также попытался вставить use lib '/work/lib' перед use MyModule в main.raku с тем же результатом.

Ответы [ 2 ]

5 голосов
/ 05 марта 2020

Новые версии Raku используют .rakumod в качестве расширения файла для модулей. Старое расширение .pm6 все еще поддерживается. Дополнительную информацию о новых расширениях файлов можно найти в билете Path-to-Raku . Больше информации о модулях доступно в документации raku .

3 голосов
/ 07 марта 2020

Есть несколько проблем.

  1. Модули не заканчиваются на .raku. Они заканчиваются .rakumod или .pm6 (на данный момент).
    (Технически после установки фактически не имеет значения, какое расширение у вас, если оно правильно объявлено в META6.json.)

  2. По умолчанию подпрограммы лексически ограничены (my), а также не экспортируются по умолчанию.
    Таким образом, нет никакого доступа к hello() вне модуля, который он определил in.

  3. Модули не имеют методов, поэтому вы не можете вызывать hello в качестве метода.
    Даже если у них есть методы, они не начнут с sub ключевое слово.


Вы можете глобально задать подпрограмму с помощью our:

lib/MyModule.rakumod

use v6.d;
unit module MyModule;

our sub hello () { say 'hello' }
#^
# \
#  globally scoped

main.raku

use v6.d;
# use lib './lib';
use module MyModule;

MyModule::hello();
#       ^^
#        \
#         namespace delimiter

Вы можете экспортировать его вместо:

lib/MyModule.rakumod

use v6.d;
unit MyModule;

#             mark for export
#            v-------v
sub hello () is export {
    say 'hello'
}

main.raku

use v6.d;
# use lib './lib';
use MyModule;

hello();

В дополнение к is export, есть другие более мелкозернистые способы экспорта .

. Я бы порекомендовал вам, если вы собираетесь экспортировать, что вы также делаете это глобально с our. Таким образом, если кто-то использует ваш модуль, но не хочет импортировать ваши сабвуферы; они все еще имеют к ним доступ.

...