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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> perl OOП, $self->value = 'something'; Подскажите, как сделать. 
:(
    Опции темы
Zuzu
Дата 19.10.2006, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Добрый день, дамы и господа!

Пусть есть некоторый класс (package) zzz, в нем - конструктор (new) и свойство value (код, не относящийся к вопросу пропущен)

Код


package zzz;

sub new {
# 
# конструктор
#
...
return $self;
}

# -----------------

# свойства

sub value {
my $self = shift;
if (@_) { $self->{'VALUE'} = shift; }
return $self->{'VALUE'};
}

....



Запись и чтение значения value происходит так:

Код


my $myObj = new zzz;                 # создание объекта

$myObj->value('Some value');      # запись 

print $myObj->value;                    # чтение




А теперь вопрос:

Можно ли сделать, чтобы было так:

Код


my $myObj = new zzz;                 # создание объекта

$myObj->value = 'Some value';    # запись (!!!)

print $myObj->value;                    # чтение






Это сообщение отредактировал(а) Zuzu - 19.10.2006, 16:54
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
nitr
Дата 19.10.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

#!/usr/bin/perl
my $myObj = zzz->new;

$myObj->{'VALUE'}  = 'gg';
print $myObj->{'VALUE'};

package zzz;

sub new {
    my $proto = shift;
    my $class = ref $proto || $proto;
    my $self    = {};
    bless $self, $proto;
    return $self;
}

так нет? но зачем


--------------------
PM   Вверх
Zuzu
Дата 19.10.2006, 17:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(nitr @  19.10.2006,  17:28 Найти цитируемый пост)
код Perl


Код

#!/usr/bin/perl
my $myObj = zzz->new;

$myObj->{'VALUE'}  = 'gg';
print $myObj->{'VALUE'};

package zzz;

sub new {
    my $proto = shift;
    my $class = ref $proto || $proto;
    my $self    = {};
    bless $self, $proto;
    return $self;
}




так нет? но зачем 


Нет, ни так. Хочется именно $self->value = 'something';

При присваивании значения должна быть вызвана процедура, отвечающая за свойство value. Все должно происходить в рамках парадигмы ООП. Применение - пожалуйста. Проверка на целостность данных на уровне объекта. Например, в качестве value экземпляром объекта принимаются только строки не длинее 200 символов, а если длиннее - обрезаются и возводится свойство $self->overloaded


Это сообщение отредактировал(а) Zuzu - 19.10.2006, 17:53
--------------------
Проводить эксперименты на живом сервере опасно, а на мертвом - бесполезно.
PM   Вверх
Ezh
Дата 21.10.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Используй аксессоры. Пример ниже, только эти проверки кушают CPU (логично, правда?), так что если нужно что-то супер быстрое, то не рекомендуется. В примере, если присвоить $foo->bar значение более 40, то оно умрет с воплем 'AAAA tolko ne eto!'  smile  smile  smile 
Если меньше 40, то все присвоится ок smile 

Код

#!/usr/bin/perl
package Foo;
use base qw(Class::Accessor::Lvalue);
__PACKAGE__->mk_accessors(qw(bar));
sub set {
    my ($self, $key) = splice(@_, 0, 2);

    if ($_[0]>40)
        {die('AAAA tolko ne eto!')};

   $self->SUPER::set($key, @_);
}
1;

package main;
my $foo = Foo->new;
$foo->bar = 39;
warn $foo->bar; # prints 39 ;-)
1;



PM MAIL   Вверх
Zuzu
Дата 23.10.2006, 06:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Ezh @  21.10.2006,  17:47 Найти цитируемый пост)
Используй аксессоры. ...


Спасибо, почитаю, попробую.

=)

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


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

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


 




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


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

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