【问题标题】:Use or not to use the namespace::sweep and/or Modern::Perl使用或不使用 namespace::sweep 和/或 Modern::Perl
【发布时间】:2014-05-01 05:52:16
【问题描述】:

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

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

我有点困惑,因为:

use namespace::autoclean 位只是良好的代码卫生,因为它 在结束时从类的命名空间中删除导入的符号 你的包的编译周期,包括 Moose 关键字。一旦上课 已经建好了,这些关键字就不需要了。 (这是首选 不要将 Moose 放在包裹的末尾)。

在书中Intermediate perl 也推荐使用namespace::autoclean

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

编写此 pragma 是为了解决优秀的 命名空间::自动清理。特别是, namespace::autoclean 将删除 超载安装的特殊符号,所以不能使用 namespace::autoclean 在重载 Perl 运算符的对象上。

... ...

在大多数情况下,namespace::sweep 应该可以作为替代品 对于命名空间::autoclean。发布后,此编译指示通过所有 namespace::autoclean 的测试,除了它自己的。

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

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

所以请有人解释一下:

  • 使用namespace::sweep 是正确的还是我应该使用namespace::autoclean 或者一个都不用?
  • 如果没有,为什么最佳实践推荐它?

对于“ModernPerl”。当然,我可能并不深入和“确切地”理解它的作用。我所知道的,(再次来自它的 doccu)

这会启用 strict 和 warnings pragma,以及所有 Perl 5.10 中可用的功能。它还支持 C3 方法解析 按 perldoc mro 中记录的顺序并加载 IO::File 和 IO::Handle 这样您就可以在文件句柄上调用方法。未来,它可能 包括额外的核心模块和编译指示。

当然,不深入了解mro,只认为这是对多重继承情况下“致命钻石”问题的解答。

直到今天,我都对它感到非常满意,因为它缩短了我所需的 pragma:

use strict;
use warnings;
use feature 'say';

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

【问题讨论】:

  • 自从你引用我的书以来,你已经得到了我的答案。你应该避免模块作为模块的建议有点奇怪,因为 pragmata 是模块。
  • @briandfoy:我说的是“应该避免像编译指示一样的模块”。我指的是Modern::Perl,它的大写意味着它增加了功能,但没有对以下代码的上下文进行其他更改。它的行为掩盖了这一点。我对 namespace::autoclean 很满意,它可能会有所帮助,但我相信大多数简单 Perl 程序的样板应该是 use strictuse warnings,仅此而已
  • @Borodin 对不起,你说:'remove namespace::sweep'。我将继续使用namespace::autocleannamespace::sweep - 因为它被推荐(作为良好的代码卫生)。无论如何,从现在开始 - 我不会使用 Modern::Perl - 所以,你的评论教会了我一些新的东西。谢谢。
  • 我不认为 Modern::Perl 暗示了这些。各种非编译指示模块都会改变以下代码的上下文。

标签: perl moose


【解决方案1】:

关于命名空间::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 最佳实践的建议至少使用其中一种。
  2. 通常可以使用 namespace::sweep,因为它表示它是为此而设计的,并且它通过了所有 namespace::autoclean 的测试。
  3. 尽管有上述第 2 点,但如果您不使用 use overload,则使用 namespace::autoclean 没有问题,因此您可以在这种情况下使用它。

【讨论】:

  • 感谢您的解释。我使用了namespace::sweep,因为我不确定关于overload(我仍然只学习perl)。原始问题的优点在于模块“Path::Class”是什么 重载了“字符串”上下文。使用namespace::autoclean 可能是安全的。
  • namespace::autoclean 只会破坏它导入的包中的重载。将它用于您的包不会破坏另一个包中的重载 (Path::Class)。就个人而言,我更喜欢namespace::sweep 而不是namespace::autoclean,这不仅是因为重载问题,还因为它对非 Moose 类更有效。 (FWIW,我也更喜欢Path::Tiny 而不是Path::Class。)
【解决方案2】:

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

我一直不喜欢Modern::Perl,因为它没有描述它的作用;在过去的某个固定点上,这是别人对“现代”的看法。

【讨论】:

  • Modern::Perl 的奇怪之处在于,如果您不知道您拥有哪个版本,您将无法判断它会做多少。
  • “现代 Perl”,OTOH,我们不必像十年前那样写 perl 的概念,我非常喜欢。
  • 确实,这个想法和那个特定的模块是不同的。 Perl 的缺点是我们不能坚持使用特定版本,只能使用该版本或更高版本(没有棘手的其他模块和附加代码,正如我在有效 Perl 编程中所展示的那样)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-18
  • 1970-01-01
  • 2012-11-27
  • 1970-01-01
  • 2014-07-15
  • 2015-04-08
相关资源
最近更新 更多