LINUX.ORG.RU

Возможен ли нормальный синтаксис присваивания значения свойству объекта?

 


0

2

Нужно вот так:

$obj->property=$value;

В действительности же Perl 5 со всеми своими музями и мышами не может предложить ничего лучше:

$obj->property($value);

В простых случаях я благополучно обходил это использованием «sub :lvalue», но проблема в том, что такой подход не работает, если нужно проконтролировать, что присваивается свойству объекта или, тем паче, если нужно как-то отреагировать на изменение свойства (бумага->температура_поверхности_ф=451).

Собственно, я так понимаю, что слабая надежда может быть только на tied variable, возвращаемую методом с типом :lvalue? Т.е. tied variable сама проверит, присваивают ли ей что-то разумное или нет, а если нет - выдаст confess/die.

Пока не пробовал, каюсь, но интересно вообще глобальное мнение на тему того, как обойти ограничения lvalue-sub'ов в perl.

Спасибо!

ОТВЕТ:

#!/usr/bin/perl
package O::O;
use Sentinel;

sub new {
  bless {"p"=>"v"}, shift
}

sub p :lvalue {
  sentinel obj=>shift,
           get=>"get_p",
           set=>"set_p";
}

sub get_p {
  $_[0]->{"p"}
}

sub set_p {
  die 'FYAH!' if $_[1]==5;
  $_[0]->{"p"}=$_[1]
}

package main;

my $O=O::O->new();

$O->p=6;

print $O->p,"\n";

$O->p=5;

★★★★★

Последнее исправление: DRVTiny (всего исправлений: 1)

Нашёл Sentinel, можно закрывать.

DRVTiny ★★★★★
() автор топика

За Sentinel спасибо, но не ставить пробелы вокруг = - это эталонный ппц, даже со скобками читабельнее

annulen ★★★★★
()
Ответ на: комментарий от annulen

Ну, примере в принципе же писался как однострочник :) Это я потом его скопировал в файл и хотя бы переводы строк понаставил.

DRVTiny ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.