【问题标题】:module vs package, module and package模块与包,模块和包
【发布时间】:2019-01-17 03:06:32
【问题描述】:

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

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

唯一的问题是:有任何警告吗?有什么隐藏的副作用需要了解吗?

【问题讨论】:

  • 我现在唯一能想到的是,如果你想确保任何.perl 输出将四舍五入,你应该不将类设为my -旅行。它将默认为our,因此如果您不指定任何内容,则应该在这方面找到您。
  • 我能想到的只有与文档有关的事情。您需要提前知道,为了获得 Key 的文档,您需要查找 App::Config。此外,类本身的文档。查看文件结构可能并不明显,有哪些类可用。它们都没什么大不了的。
  • @jjmerelo,在这种情况下,p6doc App::Config::Key 将无法找到 App/Config/Key.pm6 中的文档,我是否理解正确?
  • 好的,从包中导出角色似乎无法正常工作。短名称可用,它适用于一个类。但是当测试.^does(或~~)时,短名称未通过测试,而FQN通过了测试:对于class Foo does Role { ... },检查Foo ~~ Role === False但Foo ~~ App::Config::Role === True。必须报告问题。
  • 在发表评论后的几个小时内完成:github.com/rakudo/rakudo/issues/2617

标签: raku


【解决方案1】:

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

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'

【讨论】:

    猜你喜欢
    • 2018-04-21
    • 2021-07-03
    • 1970-01-01
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多