扩展 Moose 对象类的构造顺序是什么?

发布于 2024-10-01 23:40:26 字数 499 浏览 5 评论 0原文

我编写了一个 Moose 对象类,它扩展了另一个 Moose 对象类:

package MySubClass;
use Moose;
extends MySuperClass;

我有一个属性,我想在对象实例化的基础上自动构建该属性:

has 'id' => (
    is       => 'ro',
    isa      => 'Str',
    builder  => '_build_id',
    init_arg => undef,
); 

sub _build_id {
 my $self = shift;
 # both ssn and bnn are attributes of MySuperClass
 return $self->ssn . $self->bnn;
}

除非我将 id 设置为惰性,否则这不起作用。为什么?

扩展对象的构造是如何完成的?

I wrote a Moose object class which extends another Moose object class:

package MySubClass;
use Moose;
extends MySuperClass;

I have an attribute which I'd like to automatically build upon object instantiation:

has 'id' => (
    is       => 'ro',
    isa      => 'Str',
    builder  => '_build_id',
    init_arg => undef,
); 

sub _build_id {
 my $self = shift;
 # both ssn and bnn are attributes of MySuperClass
 return $self->ssn . $self->bnn;
}

This doesn't work unless I set id as lazy. Why?

How is the construction of extending objects done?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

叫嚣ゝ 2024-10-08 23:40:26

引用 Moose::Manual::Laziness 属性

首先,如果这个的默认值
属性取决于其他一些
属性,那么该属性必须是
懒惰的。在对象构建过程中,
默认值不是在 a 中生成的
可预测的顺序,因此您无法计数
在其他一些属性上
生成默认值时填充。

Quote Moose::Manual::Attributes on Laziness:

First, if the default value for this
attribute depends on some other
attributes, then the attribute must be
lazy. During object construction,
defaults are not generated in a
predictable order, so you cannot count
on some other attribute being
populated when generating a default.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文