我的基于Moo的类具有惰性和非惰性属性,这两个属性都具有sub default和coercesubs.如果我没有初始化属性,我发现为普通属性调用了both default和coercesubs,但只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或者default和coerce).
那么,我的期望是不是,这是一个错误,还是什么?谢谢!
当前状态:修复于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频道上的某个人看到了这个问题并询问了它:)