3

我的基于 Moo 的类同时具有惰性和非惰性属性,它们同时具有default和子属性coerce。如果我不初始化属性,我会发现两个defaultcoercesubs 都被称为普通属性,但只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)。

那么,我的期望是否偏离了,这是一个错误,还是什么?谢谢!

4

2 回答 2

6

当前状态:修复在 009014 中发货

这两个之一是一个错误。

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

...实际上,问题在于 Method::Generate::Accessor 在触发 _use_default 时总是将其包装在 _generate_simple_set 中,而当它是 _generate_set 提供 isa+coerce+trigger 包装时 - 我相当确定 Moose 会触发所有三个当它应用默认值时,所以我们也需要。

不过,这并不是一个完全微不足道的修复,因为我没有参数化 _generate_set 来获取一个指示如何生成要设置的值的值。明天我会试着整理一下,因为我打算到时候删掉一个版本。

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

于 2012-03-17T20:21:43.490 回答
3

这对我来说是一个错误。from 的值要么default是正确的类型,要么不是。只有一半的时间拥有和执行期望是没有意义的。

于 2012-03-17T10:34:26.253 回答