【问题标题】:Is it ok to use MooseX modules with a Mouse class?可以将 MooseX 模块与 Mouse 类一起使用吗?
【发布时间】:2011-10-04 11:19:53
【问题描述】:

我意识到这通常不适用于所有 MooseX 模块,特别是在模块深入研究 Moose 和 Mouse 不同的元类的情况下。

但是这个问题出现了,因为有时 MooseX 模块在 MouseX 命名空间中没有等效模块,我发现我仍然可以在我的 Mouse 类中使用 MooseX 模块。但我想总体上问这个问题,即使有可用的 MouseX 等价物(假设我懒得安装 MouseX,或者 MooseX 版本更新了新功能)。

例如,以下是有效的:

package Foo;
use Mouse;
use MooseX::Types::Common::Numeric 'PositiveInt';
has 'bar' => (
    is => 'rw',
    isa => PositiveInt,
);

当我查看 MouseX::Types::Common::Numeric 源代码时,它几乎是 MooseX::Types::Common::Numeric 的精确副本,尽管作为依赖项的 MouseX::Types 存在差异。由于它是 perl 代码,因此使用 MouseX 模块也没有特别的性能优势。

所以如果我们有一个 Mouse 类并且可以选择使用等效的 MooseX 和 MouseX 模块,那么我们必须选择 MouseX 选项的原因是什么?为什么还有 MouseX 等价物?

顺便说一句,我们应该如何与Any::Moose 联系起来?

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    使用Mouse 的目的是访问Moose 的大部分功能,同时消除其昂贵的启动时间和类似Yggdrasil 的依赖树。如果您使用MooseX 模块,该模块会引入Moose,或者至少是Moose::Exporter/Moose::Role,然后您就消除了Mouse 的好处。观察:

    rsimoes@desk-o-simoes:~$ time perl -MMouse -e 1
    
    real    0m0.026s
    user    0m0.020s
    sys     0m0.000s
    
    rsimoes@desk-o-simoes:~$ time perl -MMouse -MMouseX::Types::Common::Numeric -e 1
    
    real    0m0.032s
    user    0m0.030s
    sys     0m0.000s
    

    这么快!但后来:

    rsimoes@desk-o-simoes:~$ time perl -MMoose -e 1
    
    real    0m0.148s
    user    0m0.120s
    sys     0m0.020s
    
    rsimoes@desk-o-simoes:~$ time perl -MMouse -MMooseX::Types::Common::Numeric -e 1
    
    real    0m0.181s
    user    0m0.150s
    sys     0m0.020s
    

    太慢了。但是,如果这些启动时间与您正在做的事情无关,那么您甚至不应该一开始就打扰Mouse

    Any::Moose 的存在允许面向Moose 的模块使用Mouse,除非Moose 已经加载,在这种情况下它只会使用它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-23
      • 2021-09-16
      • 2023-03-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多