我的基于Moo的课程既懒惰又有具有default
和coerce
个子的非惰性属性。如果我没有初始化属性,我发现正常属性调用default
和coerce
个子,但是只为惰性属性调用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
。更重要的是,我期望从惰性和普通属性执行相同的执行顺序(default
或default
和coerce
)。
那么,我的期望是不是,这是一个错误,还是什么?谢谢!
答案 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
的值预计是正确的类型,或者不是。只有一半的时间来实现和执行期望是没有意义的。