使用或不使用namespace :: sweep和/或Modern :: Perl

kob*_*ame 3 perl moose

在我的上一个问题中 @Borodin评论了我的问题:

您应该首先删除Modern :: Perl和namespace :: sweep.应该避免使用行为为pragma的模块.

我有点困惑,因为:

使用namespace :: autoclean位只是很好的代码卫生,因为它会在包的编译周期结束时从类的命名空间中删除导入的符号,包括Moose关键字.一旦构建了类,就不需要这些关键字.(最好不要在包装的末尾放置Moose).

在书中Intermediate perl建议使用namespace::autoclean也.

是的,我用的,而不是autocleansweep因为一次-模块从doccu

编写这个pragma是为了解决优秀的namespace :: autoclean的一些问题.特别是,namespace :: autoclean将删除由重载安装的特殊符号,因此您不能对重载Perl运算符的对象使用namespace :: autoclean.

......

在大多数情况下,namespace :: sweep应该作为namespace :: autoclean的替代品.发布后,除了自己的以外,该pragma还会传递所有namespace :: autoclean的测试.

而且因为我是一个初学者,我真的很困惑.对我来说,当我阅读:这个模块解决了另一个模块的一些问题 - 意思是:使用这个.

'手册(从我应该学习的地方)说"使用它"和stackoverflow teling的专家:不要使用它.

所以,请有人解释我:

  • 它是正确的使用namespace::sweep或我应该使用namespace::autoclean或不使用它们?
  • 如果没有,为什么BestPractices推荐它?

对于'ModernPerl'.当然,我可能不太了解并且"确切地"知道是什么.我所知道的,(再次来自它的doccu)

这将启用严格和警告编译指示,以及Perl 5.10中提供的所有功能.它还启用了perldoc mro中记录的C3方法解析顺序,并加载IO :: File和IO :: Handle,以便您可以在文件句柄上调用方法.将来,它可能包括其他核心模块和编译指示.

当然,不要深刻理解mro,只能认为它是多重遗传情况下"死亡致命钻石"问题的答案.

到目前为止,我对它非常满意,因为它为我提供了所需的pragma:

use strict;
use warnings;
use feature 'say';
Run Code Online (Sandbox Code Playgroud)

那么,"Modern :: Perl"(以及其他类似的cpanm模块)的"状态"是什么?允许使用,还是不允许?

ste*_*enl 5

关于namespace :: sweep的问题:

首先,请注意namespace :: sweep解决的实际问题.

特别是,namespace :: autoclean将删除由重载安装的特殊符号,因此您不能对重载Perl运算符的对象使用namespace :: autoclean.

这意味着如果你的班级有超载的操作员,如果你也是如此,他们将无法工作use namespace::autoclean.但是只有你这个问题才会出现use overload.除此之外,namespace :: autoclean就足够了.

其次,它说可以使用namespace :: sweep而不是namespace :: autoclean:

在大多数情况下,namespace :: sweep应该作为namespace :: autoclean的替代品.发布后,除了自己的以外,该pragma还会传递所有namespace :: autoclean的测试.

所以回答你的问题,"使用namespace :: sweep是正确的还是我应该使用namespace :: autoclean或者没有使用它们?"

  1. 您应该按照Moose Best Practices的建议至少使用其中一个.
  2. 通常可以使用namespace :: sweep,因为它表示它是为了这样做而且它通过了所有namespace :: autoclean的测试.
  3. 尽管如上所述,如果你不这样做,use overload那么你在使用namespace :: autoclean时没有问题,所以你可以在这种情况下使用它.