加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – Moose是否有义务在打电话给更清楚后再打电话给建筑师?

发布时间:2020-12-16 06:28:06 所属栏目:大数据 来源:网络整理
导读:我想从存储在Moose类中的列表中获取元素.该类知道如何填充该列表本身.它有点像迭代器,除了我希望能够重置迭代器,并开始从该列表中获取相同的元素,就好像我还没有这样做.我打算如下打电话: while( my $slotlist = $class-get_next_slotlist ) { # do somethi
我想从存储在Moose类中的列表中获取元素.该类知道如何填充该列表本身.它有点像迭代器,除了我希望能够重置迭代器,并开始从该列表中获取相同的元素,就好像我还没有这样做.我打算如下打电话:

while( my $slotlist = $class->get_next_slotlist ) {
    # do something with $slotlist
}

除此之外,正如我所说,我可能希望稍后再次重申相同的内容:

$class->reset_slotlists;
while( my $slotlist = $class->get_next_slotlist ) {
    # do something with $slotlist
}

我想要按照以下精简版(模拟)版本来设计类:

package List;
use Moose;

has '_data' => (
    traits    => [ 'Array' ],is        => 'ro',predicate => 'has_data',lazy      => 1,builder   => '_build_data',clearer   => 'reset',handles   => {
        next => 'shift',},);

sub _build_data { [ 'abc','def' ] }

package main;
use strict;
use warnings;
use Test::More;
use Test::Pretty;

my $list = List->new;
ok ! $list->has_data;
is $list->next,'abc';
is $list->next,'def';
is $list->next,undef;
is $list->next,undef;
$list->reset;
is $list->next,'abc','Moose calls builder again after clearing';
is $list->next,undef;
ok $list->has_data;

done_testing;

当我运行它时,Moose在调用reset()之后再次调用构建器(即更清晰).我的问题是:这种行为有保证吗?文档没有说.

(在输入这个问题时,我也开始疑惑:你认为这是不好的设计吗?我喜欢类似迭代器的界面,在调用方面非常优雅,并且易于实现.但是这个问题是设计不是一个标志不好吗?)

解决方法

是的,如果已清除延迟属性,则下次调用访问者时,将重建该值.

清除_data基本上就像做删除($self-> {_ data}).或者如果Moose对象是hashrefs,但它们不是hashrefs,它们是对象. (实际上它们是下面的hashrefs,但是Moose体验的一部分是我们应该假装我们不知道那个.眨眼的脸.)

延迟属性使用存在($self-> {_ data})以决定是否需要构建值.

我不认为这是一个糟糕的设计,但如果数组很大,那么在_data中保留一个副本以反复使用shift进行销毁可能会浪费内存.你可以只保留一个计数器,你在数组中的位置,每次都增加它.

更新:你没有记录得很好.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读