- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想从存储在 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, 'def';
is $list->next, undef;
is $list->next, undef;
ok $list->has_data;
done_testing;
当我运行这个时,Moose 在调用 reset() 之后再次调用构建器(即,更清晰)。我现在的问题是:这种行为有保证吗?文档没有说。
(在输入这个问题时,我也开始想:你认为这是糟糕的设计吗?我喜欢类似迭代器的接口(interface),在调用端非常优雅,并且易于实现。但这是否正是这个问题的标志设计不好?)
最佳答案
是的,如果惰性属性已被清除,那么下次调用访问器时,该值将被重建。
清除_data
本质上就像执行delete($self->{_data})
。或者,如果 Moose 对象是哈希引用,但它们不是哈希引用,它们是对象。 (实际上它们是下面的 hashref,但 Moose 体验的一部分是我们应该假装我们不知道这一点。眨眼的脸。)
惰性属性使用 exists($self->{_data})
来决定是否需要构建该值。
我不认为这是一个糟糕的设计,但如果数组很大,那么在 _data
中保留一个副本以使用 shift
迭代销毁可能会浪费内存。您可以只保留一个计数器,记录您在数组中的位置,并每次递增它。
更新:您是对的,这没有得到很好的记录。
关于perl - Moose 在调用 Clearer 后是否有义务再次调用 Builder?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21728654/
我们如何在 XACML 中使用义务?任何引用都会有所帮助 场景是义务应该引用 PIP 并将结果返回给 PEP 谢谢 来自作者评论的示例:
我是一名优秀的程序员,十分优秀!