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

Perl Moo、惰性属性和默认/强制调用,perl,moo,Perl,Moo,我的基于Moo的类既有lazy属性又有non-lazy属性,这两个属性都有default和concure子属性。如果我没有初始化属性,我会发现对于普通属性调用了default和improve子类,但是对于惰性属性只调用了default。这似乎前后矛盾。下面是示例代码: package Foo; use Moo; has nrml => ( is => 'ro', default => sub { print "nrml default\n" },

我的基于Moo的类既有lazy属性又有non-lazy属性,这两个属性都有
default
concure
子属性。如果我没有初始化属性,我会发现对于普通属性调用了
default
improve
子类,但是对于惰性属性只调用了
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
如果我在构造函数中提供值,我只希望
强制
运行。更重要的是,我希望惰性属性和正常属性都有相同的执行顺序(无论是
default
还是
default
concurve


那么,我的期望值是否偏离了,这是一个bug,还是什么?谢谢

那对我来说是个bug。
default
中的值应该是正确的类型,或者不是。只有一半的时间使用并强制执行预期是没有意义的。

当前状态:修复程序于009014年发布

其中一个是臭虫

事实上,考虑到这一点,人们可能会争论是否应该对默认值启动强制,但由于Moose确实这样做了,而且强制是结构化的(与类型检查不同,类型检查通常用于类似断言的事情,除非存在bug,否则应该始终通过),我认为应该是这样的

。。。事实上,问题在于方法::Generate::Accessor在触发时总是将其包装在"Generate"simple"集合中,当"Generate"集合提供isa+强制+触发器包装时-我相当肯定Moose在应用默认值时会触发这三个函数,所以我们也需要这样做

但这并不是一个非常简单的修复,因为我没有参数化_generate_set来获取一个值,该值指示如何生成要设置的值。明天我会尝试整理一下,因为我计划在那时削减发行量


如果您需要开发者对Moo的支持,请联系Bug-Moo@rt.cpan.org或者加入#irc.perl.org上的web simple-很幸运irc频道上的某个人看到了这个问题并问了这个问题:)

我建议您使用“构建器”而不是默认值来处理任何更琐碎的事情,从默认值的简单标量开始。这不是对您问题的回答,而是一些建议。
builder
不是专为子类需要访问父类的属性创建方法以便可以修改它的情况而设计的吗?对于那些不会被子类化的类
default
似乎更切题;结果与之前相同。使用Moo 0.9.7,我只输入了默认输出行:
nrml default lazy default
我应该提到我使用的版本:0.9.13。感谢您的回复。在提交错误报告之前,我想确定我没有做什么蠢事。有时会发生。完全是这样,我很感激能保持bug队列干净!但同样,我也很高兴你在IRC上询问你是否做了一些愚蠢的事情,或者甚至来到IRC并向我们挥舞堆栈溢出链接:)