Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Moose вопрос про атрибуты


Автор: noize 15.4.2013, 21:21
Здравствуйте.
Занялся изучением Moose. Почитал пару статей в интернете, в голове картина в целом сформировалась. Взял пару примеров, подправил их на свой лад и вдруг обнаружил, что в аттрибуте с is => 'ro' я всё-равно могу поменять значение аттрибута. Пример:
модуль MyMoo1.pm
Код

package MyMoo1;

use Moose;

has 'attr' => (
    is      => 'ro',
    isa     => 'HashRef',
    default => sub { {
        1011 => {
            name => "Maria",
            phone => "1909",
        },
        1012 => {
            name => "Jane",
            phone => "2343",
        }
    } },
);

sub mymethod {
    my ($self, $newname) = @_;
    $self->attr->{1011}->{name} = $newname;
    return $self->attr->{1011}->{name};
}

1;

и скрипт use_moo.pl
Код

#!/usr/bin/perl

use strict;
use warnings;
use MyMoo1;
use 5.010;

my $moo_obj = MyMoo1->new();
say $moo_obj->mymethod('123');

Скрипт use_moo.pl печатает значение 123, хотя в моём понимании Moose должен был ругнуться при попытке поменять значение аттрибута с аксессором ro. Или я что-то неправильно понял?

Автор: DurRandir 15.4.2013, 22:55
Вы не можете менять только значение самого атрибута, т.е. $self->attr({}) предсказуемо выдаст ошибку. По логике, у вас вместо простого хэша должны быть так же объекты с readonly полями name и phone. И вот тогда их изменить не удастся.

Автор: noize 15.4.2013, 23:23
Т.е. аксессор относится только к внутренним параметрам аттрибута(isa, default, clearer, etc), но не влияет, на те значения, которые я сохраняю в аттрибуте?

UPD: проверил, действительно, так и есть. Спасибо за объяснение, стало чуточку понятней.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)