我是一个绝对的新手,Moose到目前为止我已阅读Moose和大部分的食谱.
有一些我没有得到的东西.我创建了以下包:
package MyRange;
use Moose;
use namespace::autoclean;
has [ 'start', 'end' ] => (
is => 'ro',
isa => 'Int',
required => 1,
);
__PACKAGE__->meta->make_immutable;
1;
Run Code Online (Sandbox Code Playgroud)
然后:
use MyRange;
my $br = MyRange->new(
start => 100,
end => 180
);
Run Code Online (Sandbox Code Playgroud)
现在我可以使用eg访问我的字段$br->{start},但我也可以使用例如修改它们(尽管它们是"只读")$br->{start}=5000.我还可以添加新的密钥$br->{xxx}=111.
我错过了什么吗?对象不是以某种方式受到保护吗?这是什么意思ro?
raf*_*afl 14
当你说is => 'ro'你告诉Moose为你创建只读访问器时,那就是读者方法.你称之为
$br->start;
Run Code Online (Sandbox Code Playgroud)
要么
$br->end;
Run Code Online (Sandbox Code Playgroud)
使用这些方法设置属性将导致异常:
$br->start(42);
Run Code Online (Sandbox Code Playgroud)
如果您已经使用过is => 'rw',那么上面的工作将会更新属性的值.
你正在做的是对象的直接散列访问,这违反了封装,在使用Moose时不应该是必需的.
Moose手册,即Moose::Manual命名空间下的所有文档都详细解释了这一点.这样的问题可能是一个很好的起点Moose::Manual::Attributes.