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

Dia*_*ius 3 perl moo

我的基于Moo的类具有惰性和非惰性属性,这两个属性都具有sub defaultcoercesubs.如果我没有初始化属性,我发现为普通属性调用了both defaultcoercesubs,但只default调用了lazy属性.这似乎不一致.这是示例代码:

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;
Run Code Online (Sandbox Code Playgroud)

输出是:

nrml default
nrml coerce
lazy default
Run Code Online (Sandbox Code Playgroud)

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

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

mst*_*out 6

当前状态:修复于009014发货

其中一个是错误.

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

...事实上,问题是当它触发_use_default时,Method :: Generate :: Accessor总是将它包装在_generate_simple_set中,当它是提供isa + coerce +触发器包装的_generate_set时 - 我很确定Moose会触发所有三,当它应用默认值时,我们也需要.

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

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