Perl6:模块与软件包,模块与软件包

时间:2019-01-17 03:06:33

标签: perl6

我正在寻找一些我的知识整理。在具有复杂模块结构的项目中,我想通过构建结构化的名称空间树来保持结构的清洁。说,像这样:

App
  Config
    Key
    Node
    Param
    Type
      MyType

App :: Config下的每个条目都应包含在其自己的文件中。总是输入App::Config::Key之类的东西很浪费时间。 is export没有参数来声明要导出的名称。所以,我终于找到了以下解决方案:

Config.pm6

unit module App::Config:ver<0.0.1>;
...

Key.pm6

unit package App::Config;

class Key is export {
    ...
}

它可以按我的意愿工作:

use App::Config::Key;

say Key.^name; # App::Config::Key

唯一的问题仍然存在:有任何警告吗?有任何隐藏的副作用需要了解吗?

1 个答案:

答案 0 :(得分:0)

据我所知,唯一的问题似乎是您只能以这种方式递归声明模块。只有一个,在顶级,将是可能的。请参阅此(简化)示例:

lib/Packr/U/Packd.rakumod:

unit package Packr::U;

our class Pack'd is export {}

lib/Packr/U.rakumod:

unit module Packr::U;

lib/Packr/Packd.rakumod:

unit package Packr;

our class Pack'd is export {}

our class B::Pack'd is export {}

lib/Packr.rakumod:

unit module Packr::U;

然后是主程序:

use Packr;
use Packr::U;

for (Packr::Pack'd Packr::B::Pack'd Packr::U::Pack'd ) -> \P {
    say P.new().raku;
}

这在最后一个迭代类中失败了:

Could not find symbol '&Pack'd' in 'Packr::U'