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

Dav*_*d B 5 perl moose

我是一个绝对的新手,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.