首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Moo对象扩展顺序

Moo对象扩展顺序
EN

Stack Overflow用户
提问于 2019-03-07 15:21:05
回答 1查看 152关注 0票数 4

如果给出下面的代码,您安装对象的顺序似乎很重要。下面的代码将为两个对象打印相同的列表,而我希望每个对象都有一个不同的列表,因为list是在构建时创建的实例属性。

代码语言:javascript
复制
package t;

use Moo;
use Types::Standard qw(ArrayRef);

my @list = qw/foo bar baz/;

has list => (
    is => 'rw',
    isa => ArrayRef,
    default => sub {\@list}
);

1;
---
package u;

use Moo;
use Types::Standard qw(ArrayRef);
extends 't';

sub BUILD {
    my ($self) = @_;

    push @{$self->list()}, qw/apple banana/;
    return $self;
}
1;
---
#!perl

use Data::Printer;
use t;
use u;

my $u = u->new();
p $u->list();

my $t = t->new();
p $t->list();

当前产出:

代码语言:javascript
复制
\ [
    [0] "foo",
    [1] "bar",
    [2] "baz",
    [3] "apple",
    [4] "banana"
]
\ [
    [0] "foo",
    [1] "bar",
    [2] "baz",
    [3] "apple",
    [4] "banana"
]

预期产出:

代码语言:javascript
复制
\ [
    [0] "foo",
    [1] "bar",
    [2] "baz",
    [3] "apple",
    [4] "banana"
]
\ [
    [0] "foo",
    [1] "bar",
    [2] "baz"
]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-07 15:38:10

由于您更改了所讨论的数组,所以不希望引用用作默认\@list的数组,因此您希望获得一个浅拷贝[@list]

代码语言:javascript
复制
package t;

use Moo;
use Types::Standard qw(ArrayRef);

my @list = qw/foo bar baz/;

has list => (
    is => 'rw',
    isa => ArrayRef,
        builder =>
    default => sub { [@list] }
);

package u;

use Moo;
use Types::Standard qw(ArrayRef);
extends 't';

sub BUILD {
    my ($self) = @_;

    push @{$self->list()}, qw/apple banana/;
    return $self;
}

package main;

use Data::Printer;

my $u = u->new();
p $u->list();

my $t = t->new();
p $t->list();

当我这样做的时候,使用BUILD来修改属性是可能的,但不一定是最好的。您可以在构建器方法中使用一些类似于延迟属性的内容,然后在子类ala中重载该方法。

代码语言:javascript
复制
package t;

use Moo;
use Types::Standard qw(ArrayRef);

my @list = qw/foo bar baz/;

has list => (
    is => 'rw',
    isa => ArrayRef,
    builder => '_build_list',
    lazy => 1,
);

sub _build_list {
  my $self = shift;
  return [@list];
}

package u;

use Moo;
extends 't';

sub _build_list {
  my $self = shift;
  my $list = $self->SUPER::_build_list();
  push @$list, qw/apple banana/;
  return $list;
}

package main;

use Data::Printer;

my $u = u->new();
p $u->list();

my $t = t->new();
p $t->list();
票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55047234

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档