如何访问Moose对象的只读属性?

时间:2010-10-01 13:39:02

标签: perl moose

我是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的含义是什么?

2 个答案:

答案 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);