我正在寻找一些清理我的知识.在具有复杂模块结构的项目中,我希望通过构建结构化命名空间树来保持结构清洁.说,像:
App
Config
Key
Node
Param
Type
MyType
Run Code Online (Sandbox Code Playgroud)
App :: Config下的每个条目都应包含在自己的文件中.总是输入类似的东西App::Config::Key是浪费时间.is export没有参数来声明要导出的名称.所以,我终于找到了以下解决方案:
Config.pm6:
unit module App::Config:ver<0.0.1>;
...
Run Code Online (Sandbox Code Playgroud)
Key.pm6:
unit package App::Config;
class Key is export {
...
}
Run Code Online (Sandbox Code Playgroud)
它按我想要的方式工作:
use App::Config::Key;
say Key.^name; # App::Config::Key
Run Code Online (Sandbox Code Playgroud)
唯一的问题仍然存在:有任何警告吗?知道任何隐藏的副作用?
据我所知,唯一的问题似乎是你只能以这种方式递归地声明模块。只有一个,在顶层,是可能的。请参阅这个(简化的)示例:
lib/Packr/U/Packd.rakumod:
unit package Packr::U;
our class Pack'd is export {}
Run Code Online (Sandbox Code Playgroud)
lib/Packr/U.rakumod:
unit module Packr::U;
Run Code Online (Sandbox Code Playgroud)
lib/Packr/Packd.rakumod:
unit package Packr;
our class Pack'd is export {}
our class B::Pack'd is export {}
Run Code Online (Sandbox Code Playgroud)
lib/Packr.rakumod:
unit module Packr::U;
Run Code Online (Sandbox Code Playgroud)
然后是主程序:
use Packr;
use Packr::U;
for (Packr::Pack'd Packr::B::Pack'd Packr::U::Pack'd ) -> \P {
say P.new().raku;
}
Run Code Online (Sandbox Code Playgroud)
这在最后一个迭代类中失败:
Could not find symbol '&Pack'd' in 'Packr::U'
Run Code Online (Sandbox Code Playgroud)