我意识到所有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
?
答案 0 :(得分:5)
使用Mouse
的目的是访问Moose
的大部分功能,同时消除其昂贵的启动时间和类似Yggdrasil的依赖树。如果您使用MooseX
模块,该模块会引入Moose
或至少Moose::Exporter
/ Moose::Role
,然后您就会消除{ {1}}。观察:
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
,在这种情况下它只会使用它。