Moo,惰性属性和默认/强制调用

时间:2012-03-17 01:43:49

标签: perl moo

我的基于Moo的课程既懒惰又有具有defaultcoerce个子的非惰性属性。如果我没有初始化属性,我发现正常属性调用defaultcoerce个子,但是只为惰性属性调用default。这似乎不一致。这是示例代码:

package Foo;
use Moo;

has nrml => ( is => 'ro',
              default => sub { print "nrml default\n" },
              coerce  => sub { print "nrml coerce\n" } 
            );

has lazy => ( is => 'ro',
              lazy => 1,
              default => sub { print "lazy default\n" },
              coerce  => sub { print "lazy coerce\n" }
            );



my $q = Foo->new( );

$q->lazy;

输出结果为:

nrml default
nrml coerce
lazy default

如果我在构造函数中提供值,我只希望运行coerce。更重要的是,我期望从惰性和普通属性执行相同的执行顺序(defaultdefaultcoerce)。

那么,我的期望是不是,这是一个错误,还是什么?谢谢!

2 个答案:

答案 0 :(得分:6)

当前状态:修复于009014发货

其中一个是错误。

事实上,考虑到这一点,人们可以争论是否强制 - 应该是违约,但是因为Moose确实这样做了,而且强制是结构性的(不像类型检查,它通常用于断言)事情并且应该总是通过,除非存在错误),我认为它就是这样。

...实际上,问题是当触发_use_default时,Method :: Generate :: Accessor总是将它包装在_generate_simple_set中,当它是提供isa + coerce +触发器包装的_generate_set时 - 我很确定当Moose应用默认值时,Moose将全部触发,因此我们也需要这样做。

尽管如此,这并不是一个完全无关紧要的修复,因为我没有参数化_generate_set来获取一个值来指示如何生成要设置的值。我明天会尝试解决这个问题,因为我打算在那时删除一个版本。

如果您想从开发人员那里获得对Moo的支持,请联系bugs-Moo@rt.cpan.org或者在irc.perl.org上加入#web-simple - 幸运的是,IRC频道上的某个人看到了这个问题,问起来:)

答案 1 :(得分:3)

这对我有资格作为一个错误。来自default的值预计是正确的类型,或者不是。只有一半的时间来实现和执行期望是没有意义的。