gpt4 book ai didi

raku - 使用 rakudo-star 加载 Raku 模块的正确方法是什么?

转载 作者:行者123 更新时间:2023-12-03 18:31:27 24 4
gpt4 key购买 nike

我有以下项目

$ 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 image .但是会出现以下情况
$ 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 中,结果相同。

最佳答案

有几个问题。

  • 模块不以 .raku 结尾.它们以 .rakumod 结尾或 .pm6 (目前)。
    (从技术上讲,安装后,只要您在 META6.json 中正确声明了扩展名,它实际上并不重要。)
  • 默认情况下,子例程在词法范围内( my ),并且默认情况下也不导出。
    所以没有办法访问hello()在定义它的模块之外。
  • 模块没有方法,所以不能调用 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 ,有 other more fine grained ways to export .

    如果您要导出,我建议您也使用 our 将其设为全局。 .这样,如果有人使用您的模块,但不想导入您的潜艇;他们仍然可以访问它们。

    关于raku - 使用 rakudo-star 加载 Raku 模块的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60537215/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com