8

我有以下项目

$ 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();

我想使用最新的rakudo-star 图像运行 main.raku 。但是会出现以下情况

$ 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 中插入,结果相同。

4

2 回答 2

5

新的 Raku 版本.rakumod对模块使用 as 文件扩展名。旧的.pm6扩展仍然受支持。有关新文件扩展名的更多信息,请参阅Path-to-Raku票证。有关模块的更多信息,请参阅raku 文档

于 2020-03-05T05:08:56.490 回答
5

有几个问题。

  1. 模块不以.raku. 它们以.rakumodor结尾.pm6(现在)。
    (从技术上讲,安装后,只要您在 . 中正确声明了扩展名,它实际上并不重要META6.json。)

  2. 默认情况下,子例程在词法范围内 ( my),并且默认情况下也不导出。
    所以没有办法hello()在它定义的模块之外访问。

  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. 这样,如果有人使用您的模块,但不想导入您的潜艇;他们仍然可以访问它们。

于 2020-03-07T00:11:28.290 回答