我是Moose
的绝对新手,到目前为止,我已阅读Moose
和大多数Cookbook。
有一些我没有得到的东西。我创建了以下包:
package MyRange;
use Moose;
use namespace::autoclean;
has [ 'start', 'end' ] => (
is => 'ro',
isa => 'Int',
required => 1,
);
__PACKAGE__->meta->make_immutable;
1;
然后:
use MyRange;
my $br = MyRange->new(
start => 100,
end => 180
);
现在,我可以使用以下方式访问我的字段$br->{start}
,但我也可以修改它们(尽管它们是“只读”),例如$br->{start}=5000
。我还可以添加$br->{xxx}=111
等新密钥。
我错过了什么吗?对象不是以某种方式受到保护吗? ro
的含义是什么?
答案 0 :(得分:14)
当你说is => 'ro'
时,你告诉Moose为你创建只读访问器,也就是读者方法。你称之为
$br->start;
或
$br->end;
使用这些方法设置属性将导致异常:
$br->start(42);
如果您使用过is => 'rw'
,则上述操作会更新属性的值。
你正在做的是对象的直接散列访问,这违反了封装,在使用Moose时不应该是必需的。
Moose手册,即Moose::Manual
命名空间下的所有文档都详细说明了这一点。像这样的问题的一个很好的起点可能是Moose::Manual::Attributes
。
答案 1 :(得分:3)
当您使用$br->{start}
访问该属性时,您绕过了访问者,并且您正在直接使用底层的Moose实现。你可以做到,但你不应该这样做。此外,如果Moose更改了实现,您的代码将会中断。
您应该使用访问器方法访问该属性:
my $start = $br->start;
如果您说该属性为“RO”,则表示您不允许使用访问者更改属性值:
$br->start(32);