Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Moose вопрос про атрибуты 
:(
    Опции темы
noize
Дата 15.4.2013, 21:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 10.7.2010
Где: СПб

Репутация: 3
Всего: 3



Здравствуйте.
Занялся изучением 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. Или я что-то неправильно понял?
PM MAIL   Вверх
DurRandir
Дата 15.4.2013, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 335
Регистрация: 27.9.2009

Репутация: 14
Всего: 17



Вы не можете менять только значение самого атрибута, т.е. $self->attr({}) предсказуемо выдаст ошибку. По логике, у вас вместо простого хэша должны быть так же объекты с readonly полями name и phone. И вот тогда их изменить не удастся.
PM   Вверх
noize
Дата 15.4.2013, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


5.18.2
*


Профиль
Группа: Участник
Сообщений: 89
Регистрация: 10.7.2010
Где: СПб

Репутация: 3
Всего: 3



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

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

Это сообщение отредактировал(а) noize - 15.4.2013, 23:32
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1023 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.