我正在寻找一些我的知识整理。在具有复杂模块结构的项目中,我想通过构建结构化的名称空间树来保持结构的清洁。说,像这样:
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
唯一的问题仍然存在:有任何警告吗?有任何隐藏的副作用需要了解吗?
答案 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'