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

时间:2014-03-24 01:57:46

标签: perl moose

在我的last question @Borodin评论我的问题:

  

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

我有点困惑,因为:

  

use namespace :: autoclean bit就像它一样简单的代码卫生   从类的命名空间中删除导入的符号   你的包的编译周期,包括Moose关键字。一旦上课   已经构建,不需要这些关键字。 (这是首选   在包裹的末尾放置没有驼鹿。)

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

是的,我使用的是代替autoclean sweep模块 - 因为from the doccu

  

这篇编译指出是为了解决一些优秀问题   命名空间::自动清洗。特别是,namespace :: autoclean将被删除   由重载安装的特殊符号,因此您无法使用   对重载Perl运算符的对象执行namespace :: autoclean。

     

...   ...

     

在大多数情况下,namespace :: sweep应该作为替代品   for namespace :: autoclean。一旦发布,这个pragma将全部通过   namespace :: autoclean的测试,除了它自己的。

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

'手册(我应该从哪里学到)说“使用它”和stackoverflow teling的专家:不要使用它

所以,请有人解释我:

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

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

  

这会启用strict和warnings pragma,以及所有   Perl 5.10中提供的功能。它还支持C3方法解析   按照perldoc mro中的说明命令并加载IO :: File和IO :: Handle   这样你就可以在文件句柄上调用方法。在将来,它可能会   包括其他核心模块和编译指示。

当然,不要对use strict; use warnings; use feature 'say'; 深表理解,只能认为这是多重遗产情况下“致命的死亡钻石”问题的答案。

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

{{1}}

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

2 个答案:

答案 0 :(得分: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. 尽管上面的第2点,如果你不use overload,那么你在使用namespace :: autoclean时没有问题,所以你可以在这种情况下使用它。 / LI>

答案 1 :(得分:3)

指定use 5.014;(或其他版本> = 5.011)将自动执行use strict;并为您启用该版本的所有功能; IMO这就是Modern :: Perl没有获得大量牵引力的部分原因。

我一直不喜欢Modern::Perl因为它没有描述它的作用;这是其他人的想法"现代"在过去的一些固定点。